Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果一个字符串出现在一个大的对象列表中,比较它的最快(性能)方法是什么?_C#_String_List - Fatal编程技术网

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 do
return 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))
  //...