110

次の簡単な例を考えます。

    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 演算子の問題ですか?

4

4 に答える 4

262

StringComparerあなたが必要とすることを行います:

List<string> list = new List<string>() {
    "One", "Two", "Three", "three", "Four", "Five" };

var distinctList = list.Distinct(
    StringComparer.CurrentCultureIgnoreCase).ToList();

(または、比較しているデータに応じて、不変/序数/など)

于 2008-11-12T06:41:52.843 に答える
5

[最も簡潔なアプローチが必要な場合は、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
}
于 2008-11-12T06:42:22.640 に答える
1

 ## 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);
  }

出力は

   USA 
   INDIA
   UK
于 2017-04-28T11:11:00.210 に答える
0

これははるかに単純なバージョンです。

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();
于 2009-01-13T18:02:18.247 に答える