Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 我可以搜索已排序的列表吗<;T>;在我搜索的字段上排序会更快吗?_C#_Sorting_Find_Binary Search - Fatal编程技术网

C# 我可以搜索已排序的列表吗<;T>;在我搜索的字段上排序会更快吗?

C# 我可以搜索已排序的列表吗<;T>;在我搜索的字段上排序会更快吗?,c#,sorting,find,binary-search,C#,Sorting,Find,Binary Search,我认为在我搜索的字段上排序列表将加快搜索速度。 假设对象模型中的列表为10.000,而列表为10.000。 我循环模型中的人员列表,希望找到属性为c.Owner==person.Name的汽车 public static Car Car(Model model, Person person) { return model.Cars.Find( delegate(Car c) {

我认为在我搜索的字段上排序
列表将加快搜索速度。
假设对象模型中的
列表
为10.000,而
列表
为10.000。 我循环模型中的人员列表,希望找到属性为c.Owner==person.Name的汽车

public static Car Car(Model model, Person person)
        {
            return model.Cars.Find(
                 delegate(Car c)
                 {
                     return c.Owner.Equals(person.Name);
                 });
        }
对车主的汽车清单进行排序不会加快循环速度吗

我想也许我应该使用
BinarySearch
,但是
BinarySearch
的重载不允许委托。当您必须将要查找的汽车作为参数时,
BinarySearch
的用途是什么?

不接受委托,但它确实有一个接受
IComparer
的代理。将该重载与相应的自定义比较器(
CarByOwnerComparer:IComparer
)一起使用,以使其按您希望的方式进行搜索。当然,请记住,必须使用比较器对列表进行排序,才能进行二进制搜索。如果你喜欢写一个委托(例如通过lambda)来实现一个接口,考虑使用一个可以在这两个之间转换的转换器,比如这里提供的。
但是,我建议您使用更合适的集合类,它提供了按键快速检索。例如,
SortedList
SortedDictionary
都将在
O(logn)
中完成工作。如果排序不是一项真正的要求,那么只需使用
字典

就可以轻松地回答问题的第一部分。我使用了IComparer,但发现我无法在BinarySearch中使用委托。所以我不明白编写接口IComparer(我想这就是你所说的接口)有什么帮助。我将不得不在不同的字段组合上进行查找,因此我考虑在循环之前进行不同的排序,并在循环中进行查找。关于你答案的第二部分。我考虑使用SortedDictionary,但我必须能够使用不同的键集-我不认为更改所有键是可能的,也不明智?或者我可以把钥匙做成一个外观,根据不同的设置有不同的值吗?@Gerard:我发现很难理解这一点,不管怎样,我怀疑一个简单的评论能回答这个问题。(我只能说:是的,您可以编写一个封装多个属性的类,并将其用作键)。我可以建议你问一个不同的问题来澄清这些问题吗?干杯。我现在知道这是个好答案。我将继续提出另一个问题,并尝试其中一些想法。