C# 从循环中创建唯一字符串列表的最快方法?
我有一组字符串(~80000),只能通过hits.Doc(int.Get)(“fieldName”)方法按顺序访问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
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);
}