我有一个对象集合,每个对象都有一个int Frame属性。给定一个int,我想在集合中找到具有最接近Frame的对象。
这是我到目前为止所做的事情:
public static void Search(int frameNumber)
{
var differences = (from rec in _records
select new { FrameDiff = Math.Abs(rec.Frame - frameNumber), Record = rec }).OrderBy(x => x.FrameDiff);
var closestRecord = differences.FirstOrDefault().Record;
//continue work...
}
这很好,一切都很好,除了我的收藏中有200,000个项目,我经常调用这个方法。有没有相对简单,更有效的方法来做到这一点?
答案 0 :(得分:5)
var closestRecord = _records.MinBy(rec => Math.Abs(rec.Frame - frameNumber));
使用MoreLINQ中的MinBy。
答案 1 :(得分:3)
您可能想要尝试的是将帧存储在按Frame
排序的数据结构中。然后,当您需要找到与给定frameNumber最接近的一个时,您可以进行二进制搜索。
答案 2 :(得分:1)
我不知道我会使用LINQ,至少不使用orderby。
static Record FindClosestRecord(IEnumerable<Record> records, int number)
{
Record closest = null;
int leastDifference = int.MaxValue;
foreach (Record record in records)
{
int difference = Math.Abs(number - record.Frame);
if (difference == 0)
{
return record; // exact match, return early
}
else if (difference < leastDifference)
{
leastDifference = difference;
closest = record;
}
}
return closest;
}
答案 3 :(得分:0)
你可以将你的陈述合并为一个ala:
var closestRecord = (from rec in _records
select new { FrameDiff = Math.Abs(rec.Frame - frameNumber),
Record = rec }).OrderBy(x => x.FrameDiff).FirstOrDefault().Record;
答案 4 :(得分:0)
也许你可以将你的大项目清单分成5到10个由他们的Framediff订购的小名单?
这样,如果您知道需要搜索哪个列表
,搜索速度会更快