【问题标题】:LINQ Distinct operator, ignore case?LINQ Distinct 运算符,忽略大小写?
【发布时间】:2017-04-28 23:54:42
【问题描述】:

举个简单的例子:

    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 相同数量的项目。相反,我希望,例如,“三”和“三”被认为是相等的。

是我遗漏了什么还是 Distinct 运算符的问题?

【问题讨论】:

    标签: c# linq string comparison distinct


    【解决方案1】:

    StringComparer 满足您的需求:

    List<string> list = new List<string>() {
        "One", "Two", "Three", "three", "Four", "Five" };
    
    var distinctList = list.Distinct(
        StringComparer.CurrentCultureIgnoreCase).ToList();
    

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

    【讨论】:

      【解决方案2】:

      [如果您想要最简洁的方法,请参阅 Marc Gravells 的回答]

      经过 Bradley Grainger 的一些调查和良好反馈后,我实施了以下 IEqualityComparer。它支持不区分大小写的 Distinct() 语句(只需将 this 的一个实例传递给 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
      }
      

      【讨论】:

      • 你根本不需要这个。查看我的回复。
      • 是的,当我点击“发布您的答案”时,您的回复就到了。
      • 我记得,他们肯定彼此相距不到 20 秒。尽管如此,实现像 IEqualityComparer 这样的东西仍然是一个有用的练习,如果只是为了理解它是如何工作的......
      • 再次感谢,除非有人强烈反对,否则我会让这个答案生效。
      • 如果当前区域性为 en-US,则此示例在为 tr-TR 区域性初始化时失败,因为 GetHashCode 将报告 I (U+0049) 和 ı (U+0131) 的不同值,而Equals 会认为它们是相等的。
      【解决方案3】:

       ## 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
      

      【讨论】:

      • 请避免在没有解释的情况下发布代码sn-ps。编辑您的答案并为其添加正文。谢谢。
      【解决方案4】:

      这是一个更简单的版本。

      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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-31
        • 2020-07-25
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        相关资源
        最近更新 更多