C# 如果一个字符串出现在一个大的对象列表中,比较它的最快(性能)方法是什么?
目前我有一个包含两个字符串的对象:C# 如果一个字符串出现在一个大的对象列表中,比较它的最快(性能)方法是什么?,c#,string,list,C#,String,List,目前我有一个包含两个字符串的对象: class myClass { public string string1 { get; set; } public string string2 { get; set; } public bool MatcheString1(string newString) { if (this.string1 == newString) { return true;
class myClass
{
public string string1 { get; set; }
public string string2 { get; set; }
public bool MatcheString1(string newString)
{
if (this.string1 == newString)
{
return true;
}
return false;
}
}
然后,我有了第二个类,它使用list生成上述对象的列表
class URLs : IEnumerator, IEnumerable
{
private List<myClass> myCustomList;
private int position = -1;
// Constructor
public URLs()
{
myCustomList = new List<myClass>();
}
}
本质上,随着对象列表增长到100000大关,这个过程变得非常缓慢。什么是检查字符串是否存在的快速方法?我很乐意在类之外创建一个列表进行验证,但这对我来说似乎有点麻烦?在排序数组(List)上搜索需要O(logN)
var sortedList=new SortedSet();
分类列表。添加(“abc”);
//等等
分类列表。包含(“测试”);
对哈希集的搜索需要O(1),但我猜在100k个元素(Log(100000)=5)的情况下,与占用更多内存的哈希集几乎没有区别。一旦项目列表稳定,您可以计算匹配的哈希集,例如:
// up-front work
var knownStrings = new HashSet<string>();
foreach(var item in myCustomList) knownStrings.Add(item.string1);
这是非常便宜的(O(1)而不是O(N))。如果您不介意使用不同的数据结构,而不是列表,您可以使用一个字典,其中对象通过其
string1
属性进行索引
public URLs()
{
myDictionary = new Dictionary<string, myClass>();
}
使用集合而不是列表。基于散列的集合有
O(1)
lookup(可能会降级为O(n)
),基于树的集合有O(logn)
lookupjust doreturn this.string1==newString
哈希集比排序数组占用更多内存,并且几乎没有O(1)和O(logN)的差异。对于任何非平凡的N,O(1)和O(logN)都有明显的不同-特别是当通过检查大量值组合时;对于10k元素Log(10k)=4:-)@sh1ng,问题是“最快的”,是的,但是假设你使用以100000000为底的对数,那么10000的对数只有0.5。你明白了吗?@ChrisS,这是一个描述你的真实场景的问题;p只有在他使用BinaraySort
方法时,才使用列表的排序。然而,这可能不是他想要的。编辑:如果他真的想搜索一个排序的集合,他也可以考虑使用<代码> SooDeSET < /C>。计算机在基2上工作,所以Log2(100000)=16。这是一个巨大的不同。顺便说一下:您应该提到元素类型应该实现IComparable
。否则这将崩溃。您正确地指出哈希集使用了更多内存,但是如果使用newhashset(listOfValues)
使用预构建列表创建哈希集,则内存消耗只会稍微高一点。不幸的是,HashSet不允许直接设置其容量,因为它的设计使其容量始终是一个素数(人们不会接受将容量设置为100000,然后实际获得108631的容量)。
// up-front work
var knownStrings = new HashSet<string>();
foreach(var item in myCustomList) knownStrings.Add(item.string1);
return knownStrings.Contains(newString);
public URLs()
{
myDictionary = new Dictionary<string, myClass>();
}
if(myDictionary.ContainsKey(newString))
//...