2011-06-03 19 views

Respuesta

94
objList.Select(o=>o.typeId).Distinct() 
+2

La segunda forma parece usar una sobrecarga de distinta que no existe por lo que yo sé. –

+0

Vaya, elimine el segundo, gracias @Jon Skeet, que se puede hacer con IEqualityComparer –

+0

Como mencionó Jon Skeet, esto solo devolverá las propiedades especificadas en el Seleccionar. –

6

Claro, use Enumerable.Distinct.

Dada una colección de obj (por ejemplo foo), que haría algo como esto:

var distinctTypeIDs = foo.Select(x => x.typeID).Distinct(); 
2

Creo que esto es lo que busca:

var objs= (from c in List_Objects 
orderby c.TypeID select c).GroupBy(g=>g.TypeID).Select(x=>x.FirstOrDefault());  

similares a este Returning a Distinct IQueryable with LINQ?

+0

'.Primero 'está bien, ya que no tendrías el grupo si no hubiera algo en él. – mquander

+1

Puede usar una sobrecarga alternativa de 'GroupBy' para hacer esto más simple también; vea mi respuesta para ver un ejemplo. –

32

Suponiendo que quiere el objeto completo, pero solo quiere tratar con la distinción por typeID, no hay nada incorporado int o LINQ para hacer esto fácil. (Si simplemente desea que los typeID valores, es fácil - proyecto para que, con Select y luego usar el Distinct llamada normal.)

En MoreLINQ tenemos el operador DistinctBy que se podría utilizar:

var distinct = list.DistinctBy(x => x.typeID); 

Esto solo funciona para LINQ to Objects.

Se puede utilizar una agrupación o una búsqueda, es sólo algo molesto e ineficaz:

var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First()); 
+0

Para que aparezca DistinctBy, debe agregar el espacio de nombres Microsoft.Ajax.Utilities – Shiljo

+0

@Shil: No, estaba escribiendo sobre DistinctBy en MoreLINQ. Nada que ver con Microsoft.Ajax.Utilities. –

1

me querían obligar a los datos particulares a desplegable y debe ser distinto. hice lo siguiente:

List<ClassDetails> classDetails; 
List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList(); 
ddlData.DataSource = classDetailsData; 
ddlData.Databind(); 

ver si ayuda

9

Si sólo desea que el usuario pura LINQ, puede utilizar GroupBy:

List<obj> distinct = 
    objs.GroupBy(car => car.typeID).Select(g => g.First()).ToList(); 

Si quieres un método que se utiliza en todo a través de la aplicación:

public static IEnumerable<TSource> DistinctBy<TSource, TKey> 
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) 
{ 
    HashSet<TKey> seenKeys = new HashSet<TKey>(); 
    foreach (TSource element in source) 
    { 
     if (!seenKeys.Contains(keySelector(element))) 
     { 
      seenKeys.Add(keySelector(element)); 
      yield return element; 
     } 
    } 
} 

como MoreLinq ¿el

uso de este método para encontrar los valores distintos utilizando sólo la propiedad Id, se puede utilizar:

var query = objs.DistinctBy(p => p.TypeId); 

puede utilizar varias propiedades:

var query = objs.DistinctBy(p => new { p.TypeId, p.Name }); 
Cuestiones relacionadas