【问题标题】:Linq delete duplicate ignore caseLinq删除重复忽略大小写
【发布时间】:2018-05-31 01:24:30
【问题描述】:

我有这样的示例列表数据

var a = {Apple, Orange, WaterMelon, AppleE, Orange, Apple}

我想从该列表中删除重复项并获取一个新列表。 我的代码:

var b = a.GroupBy(x => x).Where(y => y.Count() >= 1).Select(z => z.Key).ToList();

但它会返回

var b = {Apple, AppleE, Apple, Orange, WaterMelon}

如何摆脱这种不同的情况?就像 excel 中的过滤系统一样,只能得到 1 个苹果。

【问题讨论】:

    标签: c# asp.net asp.net-mvc linq asp.net-mvc-4


    【解决方案1】:

    您可以使用字典,将字符串添加到 lower 作为键和字符串作为值。

    List<string> mylist = new List<string> { "app", "App", "zz", "zZ" };
                Dictionary<string, string> dict = new Dictionary<string, string>();
                string key = string.Empty;
                foreach(string c in mylist)
                {
                    key = c.ToLower();
                    if(!dict.Keys.Contains(key))
                    {
                        dict.Add(key, c);
                    }
                }
                var t = dict.Values;
    

    【讨论】:

      【解决方案2】:

      这将过滤它的大小写:

      // using System.Linq;
      
      var a = new[]{"Apple", "Orange", "WaterMelon", "ApplE", "Orange", "APple"};
      var b = a.Where(x => a.Count(i => i == x) == 1);
      

      如果您想在不考虑大小写的情况下获得它们:

      using System.Linq;
      using System;
      
      public class Program
      {
          public static void Main()
          {
              var a = new[]{"Apple", "Orange", "WaterMelon", "ApplE", "Orange", "APple"};
              var b = a.Where(x => a.Count(i => i.Equals(x, StringComparison.OrdinalIgnoreCase )) == 1);
      
              System.Console.WriteLine(string.Join(",", b));
          }
      }
      

      输出(区分大小写):

      Apple,WaterMelon,ApplE,APple
      

      输出(不敏感):

      WaterMelon
      

      【讨论】:

        【解决方案3】:

        GroupBy 接受一个实现,如果IEqualityComparer&lt;T&gt;,StringComparer 实现这个并提供标准的预配置选项:

        a.GroupBy(x => x, StringComparer.OrdinalIgnoreCase).Select...
        

        有多种选择,包括CurrentCultureIgnoreCaseInvariantCultureIgnoreCaseOrdinalIgnoreCase

        更多详情:https://msdn.microsoft.com/en-us/library/system.stringcomparer.ordinalignorecase(v=vs.110).aspx

        【讨论】:

        • 好的,它有效。谢谢。但是,我只是意识到我可以在 GroupBy 中添加实现。也是另一个功能吗?
        • 任何实现 IEqualityComparer 的函数或委托。虽然如果你将它传递给 EntityFramework 或其他 Linq 提供者,最好还是坚持框架的一些默认实现。
        猜你喜欢
        • 2019-10-17
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 2023-02-02
        • 2011-11-17
        • 2021-09-07
        • 1970-01-01
        相关资源
        最近更新 更多