次の簡単な例を考えます:
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();
CaseInsensitiveComparerは、大文字と小文字を区別しない比較を行うために実際には使用されていないようです。
つまり、distinctListにはlistと同じ数のアイテムが含まれます。代わりに、たとえば、「3」と「3」が等しいと見なされることを期待します。
私は何かを見逃していますか、これはDistinct演算子の問題ですか?
StringComparer
は必要なことを行います:
List<string> list = new List<string>() {
"One", "Two", "Three", "three", "Four", "Five" };
var distinctList = list.Distinct(
StringComparer.CurrentCultureIgnoreCase).ToList();
(または比較するデータに応じて、不変式/序数/など)
[最も簡潔なアプローチが必要な場合は、Marc Gravellsの回答をご覧ください]
Bradley Graingerからの調査と良いフィードバックの後、次のIEqualityComparerを実装しました。大文字と小文字を区別しないDistinct()ステートメントをサポートします(このインスタンスを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 }
これははるかに簡単なバージョンです。
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はBe
USA
INDIA
UK