Étant donné l'exemple simple suivant:
List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };
CaseInsensitiveComparer ignoreCaseComparer = new CaseInsensitiveComparer();
var distinctList = list.Distinct(ignoreCaseComparer as IEqualityComparer<string>).ToList();
Il apparaît que CaseInsensitiveComparer n'est pas réellement utilisé pour effectuer une comparaison insensible à la casse.
En d'autres termes, distinctList contient le même nombre d'éléments que list . Au lieu de cela, je m'attendrais par exemple à ce que "Trois" et "Trois" soient considérés comme égaux.
Est-ce que je manque quelque chose ou est-ce un problème avec l'opérateur Distinct?
StringComparer
fait ce dont vous avez besoin:
List<string> list = new List<string>() {
"One", "Two", "Three", "three", "Four", "Five" };
var distinctList = list.Distinct(
StringComparer.CurrentCultureIgnoreCase).ToList();
(ou invariant/ordinal/etc en fonction des données que vous comparez)
[Voir la réponse de Marc Gravells si vous voulez l'approche la plus concise]
Après quelques investigations et de bons retours de Bradley Grainger, j'ai implémenté le IEqualityComparer suivant. Il importe une instruction Distinct () insensible à la casse (il suffit de passer une instance de cela à l'opérateur Distinct):
class IgnoreCaseComparer : IEqualityComparer<string> { public CaseInsensitiveComparer myComparer; public IgnoreCaseComparer() { myComparer = CaseInsensitiveComparer.DefaultInvariant; } public IgnoreCaseComparer(CultureInfo myCulture) { myComparer = new CaseInsensitiveComparer(myCulture); } #region IEqualityComparer<string> Members public bool Equals(string x, string y) { if (myComparer.Compare(x, y) == 0) { return true; } else { return false; } } public int GetHashCode(string obj) { return obj.ToLower().GetHashCode(); } #endregion }
Voici une version beaucoup plus simple.
List<string> list = new List<string>() { "One", "Two", "Three", "three", "Four", "Five" };
var z = (from x in list select new { item = x.ToLower()}).Distinct();
z.Dump();
## Distinct Operator( Ignoring Case) ##
string[] countries = {"USA","usa","INDIA","UK","UK" };
var result = countries.Distinct(StringComparer.OrdinalIgnoreCase);
foreach (var v in result)
{
Console.WriteLine(v);
}
OutPut sera
USA
INDIA
UK