快速避免列表重复的方法<>在C#中

时间:2013-06-24 14:57:10

标签: c# list duplicates

我的C#程序从给定模式生成随机字符串。这些字符串存储在列表中。由于不允许重复,我这样做:

List<string> myList = new List<string>();
for (int i = 0; i < total; i++) {
  string random_string = GetRandomString(pattern);
  if (!myList.Contains(random_string)) myList.Add(random_string);
}

你可以想象这适用于数百个条目。但我面临的情况是产生数百万字符串。每次添加的字符串检查重复项都会变得越来越慢。

有没有更快的方法可以避免重复?

7 个答案:

答案 0 :(得分:40)

使用可以更有效地确定项目是否存在的数据结构,即HashSet。无论集合中的项目数是多少,它都可以确定项目是否在常量时间内处于集合中。

如果确实需要List中的项目,或者您需要生成的列表中的项目按生成顺序排列,那么您可以将数据存储在列表和哈希集;如果HashSet中当前不存在该项目,则将该项目添加到两个集合中。

答案 1 :(得分:9)

请勿使用List<>。请改用Dictionary<>HashSet<>

答案 2 :(得分:8)

最简单的方法是使用它:

myList = myList.Distinct().ToList();

虽然这需要创建一次列表,然后创建一个新列表。更好的方法可能是提前生成发电机:

public IEnumerable<string> GetRandomStrings(int total, string pattern)
{
    for (int i = 0; i < total; i++) 
    {
        yield return GetRandomString(pattern);
    }
}

...

myList = GetRandomStrings(total, pattern).Distinct().ToList();

当然,如果您不需要按索引访问项目,则可以通过删除ToList并仅使用IEnumerable来提高效率。

答案 3 :(得分:6)

如果订单不重要,您可以使用HashSet<string>

HashSet<string> myHashSet = new HashSet<string>();
for (int i = 0; i < total; i++) 
{
   string random_string = GetRandomString(pattern);
   myHashSet.Add(random_string);
}
  

HashSet类提供高性能的集合操作。集合是一个不包含重复元素的集合,其元素没有特定的顺序。

MSDN

如果订单 很重要,我建议使用SortedSet(仅限.net 4.5)

答案 4 :(得分:1)

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

    }

答案 5 :(得分:0)

Hashtable是检查项目是否存在而不是列表的更快方式。

答案 6 :(得分:0)

你试过了吗?

myList = myList.Distinct()