我的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);
}
你可以想象这适用于数百个条目。但我面临的情况是产生数百万字符串。每次添加的字符串检查重复项都会变得越来越慢。
有没有更快的方法可以避免重复?
答案 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类提供高性能的集合操作。集合是一个不包含重复元素的集合,其元素没有特定的顺序。
如果订单 很重要,我建议使用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()