2011-02-09 3 views
1

NET 3.0.Liste <Of T> Distinct dans .NET 3.0?

Y a-t-il un Distinct sur List(Of T)? De quels paquets aurais-je besoin pour importer?

Sinon, y a-t-il une équivalence?

+1

Linq n'est pas devenu disponible avant .NET 3.5. Temps de mettre à niveau peut-être. –

Répondre

0

Non, vous devez rouler votre propre ou changer votre projet .NET 3.5 ou 4.0.

0

Dans .NET 3, vous devrez rouler le vôtre. Si vous regardez Remove duplicates from a List<T> in C#, il y a une implémentation de Distinct for .NET 2 de Keith qui utilise HashSet. Cela fait partie de l'assembly System.Core, vous devrez donc référencer cela dans votre projet, ce qui impliquerait l'installation du framework .NET 3.5, mais comme .NET 3.5 fonctionne sur la même version du CLR, vous n'aura aucun problème à faire cela. Lorsque vous déployez, vous devez vous assurer que le framework .NET 3.5 est installé sur l'ordinateur client ou inclure System.Core.dll dans votre répertoire de version.

+0

Je ne souhaite pas utiliser l'assembly System.Core. Mais merci quand même – waqasahmed

2

Dans .NET 3.0, une option serait d'utiliser un Dictionary<,> avec des valeurs factices. Par exemple. (Ne gère pas null s):

List<Foo> foos = ... 
Dictionary<Foo, bool> dict = new Dictionary<Foo, bool>(); 

foreach(Foo foo in foos) 
    dict[foo] = true; 

ICollection<Foo> distinctFoos = dict.Keys; 

Si vous ne voulez pas que ce « hack », vous devrez rouler votre propre classe de jeu.

EDIT: Voici une version qui gère null s dans la source:

public static IEnumerable<T> Distinct<T>(IEnumerable<T> source) 
{ 
    if (source == null) 
     throw new ArgumentNullException("source"); 

    Dictionary<T, bool> dict = new Dictionary<T, bool>(); 
    bool nullSeen = false; 

    foreach (T item in source) 
    { 
     if (item == null) 
     { 
      if (!nullSeen) 
       yield return item; 

      nullSeen = true; 
     } 

     else if (!dict.ContainsKey(item)) 
     { 
      dict.Add(item, true); 
      yield return item; 
     } 
    } 
} 
+0

Ceci ne gère pas correctement les instances 'null' dans la' List '. – jason

+0

@Jason: Merci pour votre commentaire. Est-ce que mon édition le rend meilleur? – Ani

+0

Oui, c'est génial. – jason

0

LinqBridge vous permettra de cibler .Net 3.0 tout en utilisant Linq. Cela inclut la méthode d'extension Distinct sur IEnumerable(Of T).

+0

Je ne dois pas utiliser des choses tierces, et je dois inclure un avertissement quand on l'utilise. – waqasahmed

Questions connexes