用Linq搜索

时间:2010-06-03 15:50:32

标签: c# linq optimization search performance

我有一个对象集合,每个对象都有一个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个项目,我经常调用这个方法。有没有相对简单,更有效的方法来做到这一点?

5 个答案:

答案 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订购的小名单?

这样,如果您知道需要搜索哪个列表

,搜索速度会更快