我有一组字符串(~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。 我认为应该有更快的方法来做到这一点。有什么建议吗?
答案 0 :(得分:13)
首先,使用Hashset<string>
而不是列表,Contains方法会更快:
int count = hits.Length();
Hashset<string> idStrings = new Hashset<string>();
编辑:如果使用Hashset,则不必调用“Contains”,因为它不能包含重复项。只需使用添加,它就会自动删除重复的值。
答案 1 :(得分:1)
使用Dictionary
代替List
。 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);
}
}
如果您使用框架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
更快的数据结构(可能是树或哈希表?)。
具体来说,您需要具有次线性搜索时间的数据结构。散列表具有恒定的搜索时间,而树通常具有对数搜索时间。