避免向列表C#添加重复元素

vin*_*ini 22 c# asp.net asp.net-mvc list c#-4.0

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

我检查了所有的空格等,但我仍然在我的lines2中得到重复的值 List

我必须在这里删除我的重复值

Ser*_*kiy 39

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

lines2.AddRange(lines3.Except(lines2));
Run Code Online (Sandbox Code Playgroud)

如果lines2包含lines3中的所有项目,则不会添加任何内容.BTW内部除了用于Set<string>从第二序列获取不同的项目并验证第一序列中存在的那些项目.所以,它非常快.

  • 这是一个很好的解决方案,而且速度相当快。直到您拥有几百万条记录。然后你必须考虑使用其他方法,如 HasSet、Dictionary 或类似的方法。只是提醒一下,从惨痛的教训中吸取的教训;) (2认同)

Hab*_*bib 31

你的这张支票:

if (!lines2.Contains(lines3.ToString()))
Run Code Online (Sandbox Code Playgroud)

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

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

foreach (string str in lines3)
{
    if (!lines2.Contains(str))
        lines2.Add(str);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您lines2是任何空列表,那么您只需将lines3不同的值添加到列表中,如:

lines2.AddRange(lines3.Distinct());
Run Code Online (Sandbox Code Playgroud)

那么你的lines2意志包含不同的价值观


Fel*_*ani 24

使用HashSet<string>而不是a List<string>.它准备好执行更好的性能,因为您不需要为任何项目提供检查.该系列将为您管理它.这是a list和a 之间的区别set.样品:

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

道达尔5和值是a,b,c,d,e.

实施List<T>不会给你本地的.你可以这样做,但你必须提供这种控制.对于样本,这个extension method:

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

并使用它:

var list = new List<string>();
list.AddItem(1);
list.AddItem(2);
list.AddItem(3);
list.AddItem(2);
list.AddItem(4);
list.AddItem(5);
Run Code Online (Sandbox Code Playgroud)

  • 请记住,`HashSet` 是无序的,这意味着它不会保留添加项目的顺序。如果他需要保留特定的顺序,`HashSet` 将不起作用。 (4认同)

Ian*_*cer 5

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

  • 对于那些考虑使用 hashset 的人请注意,您无法保证订单 (5认同)