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?
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?
Non, vous devez rouler votre propre ou changer votre projet .NET 3.5 ou 4.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.
Je ne souhaite pas utiliser l'assembly System.Core. Mais merci quand même – waqasahmed
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;
}
}
}
LinqBridge vous permettra de cibler .Net 3.0 tout en utilisant Linq. Cela inclut la méthode d'extension Distinct
sur IEnumerable(Of T)
.
Je ne dois pas utiliser des choses tierces, et je dois inclure un avertissement quand on l'utilise. – waqasahmed
Linq n'est pas devenu disponible avant .NET 3.5. Temps de mettre à niveau peut-être. –