LINQ Distinct运算符,忽略大小写?

Ash*_*Ash 90 c# linq string comparison distinct

给出以下简单示例:

    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();
Run Code Online (Sandbox Code Playgroud)

似乎CaseInsensitiveComparer实际上并不用于进行不区分大小写的比较.

换句话说,distinctList 包含与列表相同数量的项目.相反,我希望,例如,"三"和"三"被认为是平等的.

我错过了什么,或者这是Distinct运营商的问题?

Mar*_*ell 212

StringComparer 做你需要的:

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

var distinctList = list.Distinct(
    StringComparer.CurrentCultureIgnoreCase).ToList();
Run Code Online (Sandbox Code Playgroud)

(或不变/序数/等取决于您要比较的数据)


Ash*_*Ash 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
}
Run Code Online (Sandbox Code Playgroud)

  • 您根本不需要这个。查看我的回复。 (6认同)
  • 是的,就像我单击“发布您的答案”一样,您的答复已经到达。 (2认同)