165 votes

Distinct en Linq sur la base d'un seul champ de la table

J'essaie d'utiliser .distinct dans Linq pour obtenir un résultat basé sur un champ de la table (afin de ne pas avoir besoin de tous les enregistrements dupliqués de la table).

Je sais écrire une requête de base en utilisant distinct comme suit :

var query = (from r in table1
orderby r.Text
select r).distinct();

mais j'ai besoin de résultats où r.text n'est pas dupliqué.

360voto

Daniel Hilgarth Points 90722

Essayez ça :

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

Cela permettra de regrouper le tableau par Text et utiliser la première ligne de chaque groupe, ce qui donne des lignes où Text est distinct.

32voto

Servy Points 93720

MoreLinq a un DistinctBy que vous pouvez utiliser :

Il vous permettra de le faire :

var results = table1.DistictBy(row => row.Text);

La mise en œuvre de la méthode (sans validation des arguments) est la suivante :

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

15voto

Tim Schmelter Points 163781

mais j'ai besoin de résultats où r.text n'est pas dupliqué

On dirait que c'est ce que vous voulez :

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

Cela permettra de sélectionner les lignes où le Text est unique.

12voto

Biraj Saha Points 81

Daniel Hilgarth La réponse de l'auteur ci-dessus conduit à un System.NotSupported exception avec Entity-Framework . Avec Entity-Framework il faut qu'il le soit :

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

3voto

TKharaishvili Points 1234

Il y a beaucoup de discussions autour de ce sujet.

Vous pouvez trouver l'un d'entre eux aquí :

L'une des suggestions les plus populaires a été la méthode Distinct prenant une expression lambda comme paramètre, comme l'a souligné @Servy.

L'architecte en chef de C#, Anders Hejlsberg, a proposé la solution suivante aquí . Nous expliquons également pourquoi l'équipe de conception du framework a décidé de ne pas ajouter une surcharge de la méthode Distinct qui prend un lambda.

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