避免在列表中添加重复元素

本文关键字:元素 添加 列表 | 更新日期: 2023-09-27 17:54:55

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

我必须删除这里的重复值

避免在列表中添加重复元素

您可以使用Enumerable。除了从lines3中获取不属于lines2的不同项目:

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

如果lines2包含了lines3中的所有条目,那么将不添加任何内容。顺便说一句,Except内部使用Set<string>从第二个序列中获取不同的项,并验证第一个序列中存在的那些项。这是非常快的

你的这张支票:

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

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

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

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

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

lines2.AddRange(lines3.Distinct());

lines2将包含不同的值。

使用HashSet<string>代替List<string>。它准备执行更好的性能,因为您不需要为任何项目提供检查。收藏馆会帮你处理的。这就是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;

Total为5,取值为abcde

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

并使用:

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已经处理你正在尝试做什么。

您可以使用简单的Union + Distinct:

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

将第二个列表中的所有项添加到第一个列表中,然后返回组合列表中的所有唯一字符串。在处理大列表时不太可能执行得很好,但它很简单。

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

如果您的检查是有效的,它要么会添加所有的项目,要么根本不添加。但是,在数组上调用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();

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

HashSet比较好

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

使用HashSetList:

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

根据#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();
    }
}

不是一个好方法,但是一种快速修复,使用bool值检查整个列表中是否有重复条目。

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;
    }
}