我正在编写一个应该在数组内快速搜索的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
非常感谢你们
答案 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,查询可以返回任何数量的结果但是 你声明你只想要第一个。