从循环中创建唯一字符串列表的最快方法?

时间:2009-03-25 10:40:45

标签: c# .net optimization

我有一组字符串(~80 000)我只能通过hits.Doc(int).Get(“fieldName”)方法顺序访问。

List<string> idStrings = new List<string>();
int count = hits.Length();
for (int i = 0; i < count; i++)
{
    string idString = hits.Doc(i).Get("id");
    if (!idStrings.Contains(idString))
        idStrings.Add(idString);
}

以后的字符串必须是int.TryParse()'d。 我认为应该有更快的方法来做到这一点。有什么建议吗?

3 个答案:

答案 0 :(得分:13)

首先,使用Hashset<string>而不是列表,Contains方法会更快:

int count = hits.Length();
Hashset<string> idStrings = new Hashset<string>();

编辑:如果使用Hashset,则不必调用“Contains”,因为它不能包含重复项。只需使用添加,它就会自动删除重复的值。

答案 1 :(得分:1)

使用Dictionary代替ListDictionary.ContainsKey方法比List.Contains方法快得多。

Dictionary<string, int> idStrings = new Dictionary<string, int>();
int count = hits.Length();
for (int i = 0; i < count; i++) {
   string idString = hits.Doc(i).Get("id");
   if (!idStrings.ContainsKey(idString)) {
      idStrings.Add(idString, 1);
   }
}

如果您使用框架3.5,则可以使用HashSet代替Dictionary

HashSet<string> idStrings = new HashSet<string>();
int count = hits.Length();
for (int i = 0; i < count; i++) {
   string idString = hits.Doc(i).Get("id");
   idStrings.Add(idString);
}

答案 2 :(得分:0)

减慢代码速度的语句是idStrings.Contains(idString)

您可以尝试使用比List更快的数据结构(可能是树或哈希表?)。

具体来说,您需要具有次线性搜索时间的数据结构。散列表具有恒定的搜索时间,而树通常具有对数搜索时间。