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

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

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

4

11 回答 11

62

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

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

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

于 2013-01-21T06:34:51.803 回答
44

你的这张支票:

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

是无效的。您正在检查您的lines2contains System.String[]sincelines3.ToString()是否会给您。您需要检查 item from 是否lines3 存在lines2

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

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

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

lines2.AddRange(lines3.Distinct());

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

于 2013-01-21T06:28:24.807 回答
40

使用 aHashSet<string>而不是 a List<string>。它准备好执行更好的性能,因为您不需要为任何项目提供检查。该集合将为您管理它。list这就是 a和 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;

总计为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);
       }
    }
}

并使用它:

var list = new List<string>();
list.AddItem(1);
list.AddItem(2);
list.AddItem(3);
list.AddItem(2);
list.AddItem(4);
list.AddItem(5);
于 2016-01-22T20:12:08.370 回答
5

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

于 2013-01-21T06:32:54.747 回答
3

你可以使用一个简单的Union+ Distinct

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

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

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

于 2013-01-21T06:35:50.940 回答
2

如果您的支票有效,它会添加所有项目,或者根本不添加。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();
于 2013-01-21T06:33:19.373 回答
2

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

于 2013-01-21T06:38:02.530 回答
1

使用HashSet它更好

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

于 2015-02-26T17:35:08.640 回答
1

将 aHashSet与您一起使用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);
    }
}

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

于 2016-12-14T09:21:59.337 回答
0

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

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;
    }
}
于 2017-11-26T12:17:37.977 回答
0

从#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();
    }
}
于 2018-08-13T04:57:10.207 回答