2010-03-17 12 views
11

Tengo dos ICollection de los cuales me gustaría tomar la unión. Actualmente, estoy haciendo esto con un ciclo foreach, pero eso se siente detallado y espantoso. ¿Cuál es el equivalente de C# de Java addAll()?C#: unión de dos ICollections? (equivalente a Java's addAll())

ejemplo de este problema:

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 

Respuesta

13

Usted puede utilizar el método Enumerable.Union extensión:

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

Desde result se declara ICollection<T>, necesitará la llamada ToList() para convertir IEnumerable<T> resultante en List<T> (que implementa ICollection<T>). Si la enumeración es aceptable, puede dejar la llamada ToList() y obtener la ejecución diferida (si lo desea).

+0

Buena llamada en ToList() –

+1

Desafortunadamente, la unión funciona como si el origen y el destino fueran conjuntos, y pasa por alto los elementos repetidos, por lo tanto, esto no es lo mismo que hacer y Java 'Collection.addAll()' donde la colección la implementación bien puede ser una lista, donde los elementos repetidos son válidos. –

+2

@edalorzo En este caso, puede usar Enumerable.Concat en su lugar: http://msdn.microsoft.com/en-us/library/bb302894 –

6

AddRange() anexa la lista fuente al final de otra y puede adaptarse a sus necesidades.

destList.AddRange(srcList);