2011-04-27 21 views
9

¿Alguien ha tenido que asignar una lista a un ISet? ¿cómo hago y hago esto?convertir una lista genérica al ISet

Decir que tengo clase

class Foo 
{ 
    ISet<Item> Items{get;set;} 
} 

ahora quiero hacer lo siguiente

var foo = new Foo(){ Items = new List<Item>(){ new Item() }} 

Respuesta

22
List<Item> myList = ... 
foo.Items = new HashSet<Item>(myList); 

Tenga en cuenta que una Set, a diferencia de un List, debe contener todos los elementos exactamente una vez. Por lo tanto, si myList contiene varias copias de algunos elementos, todas esas copias, excepto una, no llegarán al conjunto.

La igualdad de elementos (para detectar copias múltiples) está definida por los métodos Equals y GetHashCode. Si desea utilizar una definición diferente de igualdad, puede usar la sobrecarga del constructor HashSet que toma un IEqualityComparer<Item>.

5

List<T> no implementa la interfaz ISet<T> ... así que esto no es posible.

Las únicas clases que implementan ISet<T> son HashSet<T> y SortedSet<T>

Lo más cerca que podría conseguir sería (si se corta el objeto no-necesaria Listado en el medio):

var foo = new Foo { Items = new HashSet<Item> { new Item() } }; 
Cuestiones relacionadas