快速搜索集合中的对象

时间:2013-12-04 12:47:30

标签: c# performance search collections

我正在编写一个应该在数组内快速搜索的C#应用​​程序。 我有一个大集合,我正在从以下类型的对象文件中加载

public class Info {
   public long Start { get; set; }
   public long End { get; set; }
   public string Info { get; set; }
   ...
}

我需要一种快速的方法来查找该数组中的对象 开始< = SomeValue&&结束> = SomeValue

只需要第一场比赛。

请告诉我应该使用哪种收藏类型 并且可能是一种比仅仅迭代对象更快的算法。

“区间树”结构对我来说是最好的解决方案。好像>比搜索集合中的项目快30倍,直到查找并且查找项目花费不到1毫秒。使用此实现https://github.com/mbuchetics/RangeTree

非常感谢你们

4 个答案:

答案 0 :(得分:2)

使用LINQ FirstOrDefault。这将返回集合中的第一个匹配项,如果找不到任何内容,则返回null

infoList.FirstOrDefault(i => i.Start <= someValue && i.End >= someValue);

答案 1 :(得分:1)

您还可以使用ParallelLinq获得更快的结果:

//Some values
long start = 0;
long end = 100;

Info result = infoList.AsParallel().FirstOrDefault(i => i.Start <= start && i.End >= end);

答案 2 :(得分:1)

您好亲爱的,您可以使用二进制搜索快速搜索数组,这是在数组中搜索的最快机制....

希望这会对你有帮助!

public static int BinarySearch(int[] arr, int lowBound, int highBound, int value)
{
    int mid;
    while (lowBound <= highBound)
    {
        mid = (lowBound + highBound) / 2;
        if (arr[mid]<value)
        {
            lowBound = mid + 1;
            continue;
        }
        else if (arr[mid] > value)
        {
            highBound = mid - 1;
            continue;
        }
        else
        {
            return mid;
        }
    }
    return -1;//value not found
}

答案 3 :(得分:0)

你可以使用(因为它会更快)

infoList.SingleOrDefault(x => x.Start <= x.SomeValue && x.End >= x.SomeValue); 

infoList.FirstOrDefault(x => x.Start <= x.SomeValue && x.End >= x.SomeValue); 

这里有一个解释:

  

每当您使用SingleOrDefault时,您都清楚地说明了该查询   最多应该产生一个结果。另一方面,当   使用FirstOrDefault,查询可以返回任何数量的结果但是   你声明你只想要第一个。