2010-03-17 9 views
11

Ich habe zwei ICollection s von denen ich gerne die Union nehmen würde. Momentan mache ich das mit einer foreach-Schleife, aber das fühlt sich verbal und abscheulich an. Was ist das C# -Aquivalent von Javas addAll()?C#: Union von zwei ICollections? (Entsprechung von Java addAll())

Beispiel für dieses Problem:

ICollection<IDictionary<string, string>> result = new HashSet<IDictionary<string, string>>(); 
// ... 
ICollection<IDictionary<string, string>> fromSubTree = GetAllTypeWithin(elementName, element); 
foreach(IDictionary<string, string> dict in fromSubTree) { // hacky 
    result.Add(dict); 
} 
// result is now the union of the two sets 

Antwort

13

Sie können die Enumerable.Union Erweiterungsmethode:

result = result.Union(fromSubTree).ToList(); 

Seit result wird ICollection<T> erklärt, müssen Sie der ToList() Aufruf, um die resultierende IEnumerable<T> in einezu konvertieren(implementiert ICollection<T>). Wenn die Aufzählung akzeptabel ist, können Sie den Aufruf ToList() abbrechen und die Ausführung verzögern (falls gewünscht).

+0

Guter Aufruf auf der ToList() –

+1

Leider funktioniert die Union, als ob der Ursprung und das Schicksal waren Sätze, und es überblickt wiederholte Elemente, daher ist dies nicht das gleiche wie tun und Java 'Collection.addAll()' wo die Sammlung Die Implementierung kann durchaus eine Liste sein, in der wiederholte Elemente gültig sind. –

+2

@edalorzo In diesem Fall können Sie stattdessen Enumerable.Concat verwenden: http://msdn.microsoft.com/en-us/library/bb302894 –

6

AddRange() hängt die Quellenliste an das Ende eines anderen an und kann Ihren Anforderungen entsprechen.

destList.AddRange(srcList);