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

本文关键字:lt gt 方法 列表 | 更新日期: 2023-09-27 18:19:37

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

正如你所能想象的,这对于几百个条目来说是很好的。但我面临着生成数百万条字符串的情况。随着每添加一个字符串,检查重复项的速度就越来越慢。

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

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

使用可以更有效地确定项是否存在的数据结构,即HashSet。它可以在恒定时间内确定一个项目是否在集合中,而不考虑集合中的项目数。

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

最简单的方法是使用这个:

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来提高效率。

不要使用List<>。请改用Dictionary<>HashSet<>

如果订单不重要,可以使用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)

这不是一个好方法,但有点快,用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;
     }
    }

哈希表是检查项是否存在的一种比列表更快的方法。

您尝试过吗:

myList = myList.Distinct()