148 votes

Valeurs distinctes & #160;:

J’ai la question suivante, la valeur d’un XML :

J’ai besoin d’une liste distincte de ces éléments :

Comment puis-je distinctes pour l’Id de catégorie et trop dans LINQ ?

233voto

Jon Skeet Points 692016

Êtes-vous essayer d'être distinctes, en plus d'un champ? Si oui, il suffit d'utiliser un type anonyme et l'opérateur Distinct et il devrait être correct:

var query = doc.Elements("whatever")
               .Select(element => new {
                             id = (int) element.Attribute("id"),
                             category = (int) element.Attribute("cat") })
               .Distinct();

Si vous essayez d'obtenir un ensemble particulier de valeurs d'une "grande" de type, mais seulement à la recherche à un certain sous-ensemble de propriétés pour la distinction aspect, vous voulez probablement, DistinctBy mises en œuvre dans la MoreLINQ en DistinctBy.cs:

 public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
     this 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;
         }
     }
 }

(Si vous passez null comme le comparer, il va utiliser le comparateur par défaut pour le type de clé.)

34voto

Stu Points 7999

Il suffit d’utiliser le `` avec votre propre comparateur.

http://msdn.Microsoft.com/en-us/library/bb338049.aspx

31voto

James Alexander Points 2079

En plus de la réponse de Jon Skeet, vous pouvez également utiliser le groupe par des expressions pour obtenir les groupes uniques le long w / un décompte pour chaque itérations de groupes :

9voto

Olle Johansson Points 333

Je suis un peu en retard pour la réponse, mais vous pouvez faire cela si vous souhaitez que l’élément entier, non seulement les valeurs que vous voulez grouper par :

Cela vous donnera le premier élément entier correspondant à votre groupe de sélection, tout comme Jon Skeets second exemple à l’aide de DistinctBy, mais sans l’implémentation IEqualityComparer comparateur. DistinctBy sera très probablement plus rapide, mais la solution ci-dessus entraînera moins de code, si les performances ne sont pas un problème.

4voto

Mohamed Elsayed Points 21
// First Get DataTable as dt
// DataRowComparer Compare columns numbers in each row & data in each row

IEnumerable<DataRow> Distinct = dt.AsEnumerable().Distinct(DataRowComparer.Default);

foreach (DataRow row in Distinct)
{
    Console.WriteLine("{0,-15} {1,-15}",
        row.Field<int>(0),
        row.Field<string>(1)); 
}

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