128 votes

requête linq pour renvoyer des valeurs de champ distinctes à partir d'une liste d'objets

class obj
{
    int typeId; //10 types  0-9 
    string uniqueString; //this is unique
}

Supposons qu'il existe une liste avec 100 éléments d'obj, mais seulement 10 types ID uniques. Est-il possible d'écrire une requête LINQ pour renvoyer les 10 ints uniques de la liste des objs?

218voto

ArsenMkrt Points 24447
objList.Select(o=>o.typeId).Distinct()

55voto

JulioCT Points 779

Si vous souhaitez simplement utiliser Linq pur, vous pouvez utiliser groupby :

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

Si vous souhaitez qu'une méthode soit utilisée dans toute l'application, similaire à ce que fait MoreLinq :

 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;
        }
    }
}

En utilisant cette méthode pour trouver les valeurs distinctes en utilisant uniquement la propriété Id, vous pouvez utiliser :

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

vous pouvez utiliser plusieurs propriétés :

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

7voto

Donut Points 32892

Bien sûr, utilisez Enumerable.Distinct .

Étant donné une collection de obj (par exemple foo ), vous feriez quelque chose comme ceci :

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

5voto

Gage Points 4070

Je pense que c'est ce que tu cherches :

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

Similaire à ceci Retourner un IQueryable distinct avec LINQ ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X