Având în vedere două dicționare, cum înlocuiți elementele potrivite într-unul cu elementele din celălalt, lăsând restul elementelor neatinse

Aici este codul de pornire:

Dictionary dest=...;
IDictionary source=...;

// Overwrite in dest all of the items that appear in source with their new values
// in source. Any new items in source that do not appear in dest should be added.
// Any existing items in dest, that are not in source should retain their current 
// values.
...

Pot să fac acest lucru cu o bucla foreach care trece prin toate elementele din sursă, dar există o scurtă cale de a face acest lucru în C# 4.0 (poate LINQ)?

Mulțumiri

0

2 răspunsuri

Acest lucru este destul de urât, dar face treaba:

source.All(kv => { dest[kv.Key] = kv.Value; return true; });
0
adăugat
Sunteți bineveniți :-) Tind să fiu de acord cu @Austin, deși, probabil, cel mai bine pentru a evita efectele secundare în expresiile LINQ.
adăugat autor Anders Gustafsson, sursa
@Servy: Deoarece LINQ nu oferă o metodă ForEach încorporată, presupun că vă referiți la o metodă de extensie furnizată de utilizator. Presupun că metoda MergeWith de Austin se potrivește exact acestui scop.
adăugat autor Anders Gustafsson, sursa
+1 pentru efort, cel puțin ...
adăugat autor Michael Goldshteyn, sursa
Motivul pentru care am dat +1 este că explică contorțiile pe care trebuie să le treacă și justificarea pentru scrierea unei metode de extensie Merge .
adăugat autor Michael Goldshteyn, sursa
All este folosit pentru a determina dacă fiecare element îndeplinește o condiție. În acest context, îl puteți înlocui cu aproape orice metodă LINQ; ceea ce încerci să faci este să folosești doar o metodă ForEach . Faceți-o mai ușoară tuturor și folosiți doar o buclă de foreach. Foarte puțin, folosiți mai degrabă o metodă de extensie ForEach , mai degrabă decât All , deoarece este chiar mai înșelătoare.
adăugat autor Servy, sursa
Scrierea unei metode personalizate ForEach este destul de trivială , iar mulți oameni o fac pentru fiecare proiect sau folosesc metoda List.ForEach .
adăugat autor Servy, sursa

foreach este destul de mic. De ce complici lucrurile?

foreach(var src in source)
{
    dest[src.Key] = src.Value;
}

Dacă veți repeta acest lucru frecvent, puteți scrie o metodă de extensie:

public static void MergeWith(this Dictionary dest, IDictionary source)
{
    foreach(var src in source)
    {
        dest[src.Key] = src.Value;
    }
}

//usage:
dest.MergeWith(source);

În ceea ce privește "LINQ", partea interogare înseamnă că o metodă LINQ nu trebuie să aibă efecte secundare. A avea efecte secundare este adesea confuză pentru aceia dintre noi care nu așteaptă efecte secundare din partea ei.

0
adăugat
Speram doar că a existat o scurtă cale de ao face, asta-i tot.
adăugat autor Michael Goldshteyn, sursa
Metoda de extindere prezentată pare a fi cea mai bună soluție pentru această problemă, așa că vă voi da semnul ...
adăugat autor Michael Goldshteyn, sursa