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

时间:2013-01-21 06:23:09

标签: 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());
}

我检查了所有空格等,但我仍然在我的第2行List

中获得了重复值

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

11 个答案:

答案 0 :(得分:35)

您可以使用Enumerable.Except从第3行获取不在第2行中的不同项目:

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

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

答案 1 :(得分:26)

你的这张支票:

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

然后您的{{1}}将包含不同的值。

答案 2 :(得分:24)

使用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;

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

答案 3 :(得分:3)

如果您不想在列表中使用重复项,请使用HashSet。通过这种方式,任何人都可以清楚地看到你的代码是什么意思,并且你会编写更少的代码,因为HashSet已经处理了你想要做的事情。

答案 4 :(得分:3)

您可以使用简单的Union + Distinct

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

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

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

答案 5 :(得分:1)

如果您的支票有效,它可能会添加所有项目,或者根本不添加任何项目。但是,在数组上调用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();

答案 6 :(得分:1)

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

答案 7 :(得分:0)

使用HashSet更好

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

答案 8 :(得分:0)

使用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);
    }
}
如果myHashSet.Add(s)不存在,则

true将返回s

答案 9 :(得分:0)

不是一种好方法,而是一种快速解决方法, 拿一个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;
     }

    }

答案 10 :(得分: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();
    }
}