2011-04-09 13 views
6

Me pregunto cómo puedo lograr esto?Distinct in linq?

Quiero obtener los nombres sólo se diferencia de una colección de objetos

MyObject a = new Object(); 
a.Name = 'One'; 
a.Value = '10'; 


MyObject b = new Object(); 
b.Name = 'One'; 
b.Value = '15'; 


MyObject c = new Object(); 
c.Name = 'Two'; 
c.Value = '10'; 

así que quiero obtener sólo el nombre de vuelta. No me importa el valor en este caso solo el nombre.

así que traté

// añadir todos los objetos de una colección.

myCollection.Disinct()..Select(x => new MyClassToStore() {Text = x.Name, Value = x.Name}).ToList()); 

Sin embargo, tengo que hacer distinciones en el nivel de propiedad no en el nivel de objeto. Entonces quiero volver "Uno" y "Dos". En este momento recibo "One", "One" y "Two".

Veo una biblioteca llamada morelinq pero no estoy seguro de si debería usarla ya que todavía está en versión beta y no parece estar desarrollada en más.

Más toda una biblioteca para una consulta de extracto No estoy seguro de si vale la pena.

+0

relacionadas: http://stackoverflow.com/questions/489258/linq-distinct-on-a-particular-property – Cameron

Respuesta

14

Esto rellena el texto y campos de valor:

myCollection.Select(x => x.Name).Distinct() 
     .Select(x => new MyClassToStore { Text = x, Value = x }).ToList(); 
22

Tal vez algo como esto puede ayudar?

var distinctItems = items 
    .GroupBy(x => x.PropertyToCompare) 
    .Select(x => x.First()); 
+0

cómo podría conseguir meterlo en MyClassToStore – chobo2

+0

var = distinctitems myCollection.GroupBy (x => x.Name) .Seleccione (x => x.Primero()). Seleccione (nuevo MyClassToStore() {Text = x.Name, Value = x.Name}) supongo, aunque no obtuve exactamente Que necesitas. porque usar la misma propiedad (nombre) dos veces es un poco incómodo ... Creo que deberías escuchar a Cameron si necesitas solo nombres ... –

6

Si lo que desea es volver nombres distintos, puede utilizar:

myCollection.Select(x => x.Name).Distinct().ToList(); 
2

Personalmente sugiero que anule operador == y! = y determinar cómo y por qué un objeto es único allí. Luego use la llamada Distinct() en la colección.

Tiene que tener cuidado con los valores nulos, vea Microsoft Guidelines for Overloading Equals() and Operator == (C# Programming Guide).

+1

Para ser claros, no anules '==' o '! =' operador en cualquier tipo de contexto global. Lo que se sugiere aquí es anular el operador 'Equals' y' == 'que su clase hereda de' object' –

2

Puede implementar su clase de modo que el operador distinto de linq no use el comparador de igualdad predeterminado.

class YourClass:IEquatable<YourClass> 
{ 

... Su implementación detalla. ...

public bool Equals(YourClass other) 
    { 
     if (Object.Equals(this, other)) 
     { 
      return true; 
     } 
     else 
     { 
      if(Name == other.Name && Value == other.Value) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 

public override int GetHashCode() 
{ 
    return Name.GetHashCode()^Value.GetHashCode(); 
} 

}