【问题标题】:Avoid Adding duplicate elements to a List C#避免将重复元素添加到列表 C#
【发布时间】:2013-01-04 04:40:01
【问题描述】:
string[] lines3 = new string[100];
List<string> lines2 = new List<string>();
lines3 = Regex.Split(s1, @"\s*,\s*");

if (!lines2.Contains(lines3.ToString()))
{
    lines2.AddRange(lines3.Distinct().ToArray());
}

我已经检查了所有的空格等,但我的行中仍然有重复的值2 List

我必须自己删除这里的重复值

【问题讨论】:

标签: c# asp.net asp.net-mvc list c#-4.0


【解决方案1】:

你的这张支票:

if (!lines2.Contains(lines3.ToString()))

无效。您正在检查您的lines2 是否包含System.String[],因为lines3.ToString() 会给您。您需要检查lines3 中的项目是否存在于lines2 中。

您可以迭代lines3中的每个项目,检查它是否存在于lines2中,然后添加它。就像是。

foreach (string str in lines3)
{
    if (!lines2.Contains(str))
        lines2.Add(str);
}

或者,如果您的 lines2 是任何空列表,那么您可以简单地将 lines3 不同的值添加到列表中,例如:

lines2.AddRange(lines3.Distinct());

那么您的lines2 将包含不同的值。

【讨论】:

    【解决方案2】:

    如果您不希望列表中有重复项,请使用HashSet。这样一来,其他阅读您的代码的人就会清楚您的意图是什么,并且您可以编写更少的代码,因为HashSet 已经处理了您正在尝试做的事情。

    【讨论】:

    • 对于那些考虑使用 hashset 的人请注意,您不能保证订单
    【解决方案3】:

    如果您的检查有效,它会添加所有项目,或者根本不添加。但是,在数组上调用ToString 方法会返回数据类型的名称,而不是数组的内容,并且Contains 方法只能查找单个项,而不是项的集合。

    你必须检查数组中的每个字符串:

    string[] lines3;
    List<string> lines2 = new List<string>();
    
    lines3 = Regex.Split(s1, @"\s*,\s*");
    
    foreach (string s in lines3) {
      if (!lines2.Contains(s)) {
        lines2.Add(s);
      }
    }
    

    但是,如果你从一个空列表开始,你可以使用Distinct方法去除重复,你只需要一行代码:

    List<string> lines2 = Regex.Split(s1, @"\s*,\s*").Distinct().ToList();
    

    【讨论】:

      【解决方案4】:

      您可以使用Enumerable.Except 从lines3 中获取不在lines2 中的不同项目:

      lines2.AddRange(lines3.Except(lines2));
      

      如果lines2 包含lines3 中的所有项目,则不会添加任何内容。顺便说一句,除了内部使用 Set&lt;string&gt; 从第二个序列中获取不同的项目并验证第一个序列中存在的那些项目。所以,它非常快。

      【讨论】:

      • 这是一个很好的解决方案,而且速度非常快。直到你有几百万条记录。然后,您将不得不考虑使用其他方法,例如 HasSet、Dictionary 或类似方法。只是提醒一下,从艰难的教训中吸取教训;)
      【解决方案5】:

      您可以使用简单的Union + Distinct

      var lines = lines2.Union(lines3).Distinct();
      

      这会将第二个列表中的所有项目添加到第一个列表中,然后返回组合列表中的所有唯一字符串。不太可能在大型列表中表现良好,但它很简单。

      参考:http://msdn.microsoft.com/en-us/library/bb341731.aspx

      【讨论】:

        【解决方案6】:

        如果您想将不同的值保存到集合中,您可以尝试HashSet Class。它将自动删除重复值并节省您的编码时间。 :)

        【讨论】:

          【解决方案7】:

          使用HashSet 更好

          看看这里:http://www.dotnetperls.com/hashset

          【讨论】:

            【解决方案8】:

            使用HashSet&lt;string&gt; 而不是List&lt;string&gt;。它准备好执行更好的性能,因为您不需要为任何项目提供检查。该集合将为您管理它。这就是listset 之间的区别。示例:

            HashSet<string> set = new HashSet<string>();
            
            set.Add("a");
            set.Add("a");
            set.Add("b");
            set.Add("c");
            set.Add("b");
            set.Add("c");
            set.Add("a");
            set.Add("d");
            set.Add("e");
            set.Add("e");
            
            var total = set.Count;
            

            总计为5,值为abcde

            List&lt;T&gt; 的实现并没有给你原生。你可以做到,但你必须提供这种控制。例如,这个extension method:

            public static class CollectionExtensions
            {
                public static void AddItem<T>(this List<T> list, T item)
                {
                   if (!list.Contains(item))
                   {
                      list.Add(item);
                   }
                }
            }
            

            并使用它:

            var list = new List<string>();
            list.AddItem(1);
            list.AddItem(2);
            list.AddItem(3);
            list.AddItem(2);
            list.AddItem(4);
            list.AddItem(5);
            

            【讨论】:

            • 请记住,HashSet 是无序的,这意味着它不保留添加项目的顺序。如果他需要保留特定订单,HashSet 将不起作用。
            【解决方案9】:

            HashSet 与您的List 一起使用:

            List<string> myList = new List<string>();
            HashSet<string> myHashSet = new HashSet<string>();
            
            public void addToList(string s) {
                if (myHashSet.Add(s)) {
                    myList.Add(s);
                }
            }
            

            如果s 不存在,myHashSet.Add(s) 将返回true

            【讨论】:

              【解决方案10】:

              不是一个好方法,而是一种快速修复, 取一个布尔值来检查整个列表中是否有任何重复条目。

              bool containsKey;
              string newKey;
              
              public void addKey(string newKey)
              {
                  foreach (string key in MyKeys)
                  {
                      if (key == newKey)
                      {
                          containsKey = true;
                      }
                  }
              
                  if (!containsKey)
                  {
                      MyKeys.add(newKey);
                  }
                  else
                  {
                      containsKey = false;
                  }
              }
              

              【讨论】:

                【解决方案11】:

                从#Felipe Oriani 那里得到提示,我做了扩展,我想在这里永久分享。

                public static class CollectionExtension
                {
                    public static void AddUniqueItem<T>(this List<T> list, T item, bool throwException)
                    {
                        if (!list.Contains(item))
                        {
                            list.Add(item);
                        }
                        else if(throwException)
                        {
                            throw new InvalidOperationException("Item already exists in the list");
                        }
                    }
                    public static bool IsUnique<T>(this List<T> list, IEqualityComparer<T> comparer)
                    {
                        return list.Count == list.Distinct(comparer).Count();
                    }
                    public static bool IsUnique<T>(this List<T> list)
                    {
                        return list.Count == list.Distinct().Count();
                    }
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-11-12
                  • 2017-04-16
                  • 2011-11-11
                  • 2021-02-26
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-02-19
                  • 2021-10-16
                  相关资源
                  最近更新 更多