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

C# 从循环中创建唯一字符串列表的最快方法?,c#,.net,optimization,C#,.net,Optimization,我有一组字符串(~80000),只能通过hits.Doc(int.Get)(“fieldName”)方法按顺序访问 List idStrings=new List(); int count=hits.Length(); for(int i=0;i

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

List idStrings=new List();
int count=hits.Length();
for(int i=0;i
稍后字符串必须是int.TryParse()'d。
我认为应该有一个更快的方法来做到这一点。有什么建议吗?

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

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


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

首先,使用
哈希集而不是列表,Contains方法会更快:

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

编辑:如果使用哈希集,则不必调用“Contains”,因为它不能包含重复项。只需使用Add,它将自动删除重复的值。

使用
字典
而不是
列表
Dictionary.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);
   }
}

Agreed-List.Contains()是一个O(n)函数。HashSet.Contains是O(1)。太好了,这是我认为应该记住的,但没有。希望这对任何人都有意义:请注意,通过int设置容量没有过载。@Boris,对,哈希集在内部管理其容量,我将更正我的答案。
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);
   }
}
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);
}