Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 用Linq搜索_C#_Linq_Optimization_Search_Performance - Fatal编程技术网

C# 用Linq搜索

C# 用Linq搜索,c#,linq,optimization,search,performance,C#,Linq,Optimization,Search,Performance,我有一个对象集合,每个对象都有一个int-Frame属性。给定一个int,我想在集合中找到具有最近帧的对象 以下是我目前正在做的事情: public static void Search(int frameNumber) { var differences = (from rec in _records select new { FrameDiff = Math.Abs(rec.Frame - frameNumber), Record = r

我有一个对象集合,每个对象都有一个int-Frame属性。给定一个int,我想在集合中找到具有最近帧的对象

以下是我目前正在做的事情:

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...
}

这是伟大的一切,除了有200000件在我的收集,我调用这个方法非常频繁。有没有一种相对简单、更有效的方法来实现这一点?

您可能想要尝试的是将帧存储在按帧排序的数据结构中。然后,当需要查找与给定帧号最近的帧时,可以进行二进制搜索

var closestRecord = _records.MinBy(rec => Math.Abs(rec.Frame - frameNumber));

使用MinBy from.

您可以将您的语句组合成一个ala:

var closestRecord = (from rec in _records
                   select new { FrameDiff = Math.Abs(rec.Frame - frameNumber), 
                   Record = rec }).OrderBy(x => x.FrameDiff).FirstOrDefault().Record;

也许你可以把你的大项目列表分成5-10个小的列表,按照它们的Framediff或者其他什么来排序


这样,如果您知道需要在哪个列表中搜索,搜索速度会更快。我不知道我会使用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;
}
静态记录FindClosesRecord(IEnumerable记录,整数)
{
记录最近=空;
int最小差异=int.MaxValue;
foreach(记录中的记录)
{
int差=Math.Abs(number-record.Frame);
如果(差==0)
{
return record;//完全匹配,提前返回
}
否则如果(差异<最小差异)
{
最小差异=差异;
最近的=记录;
}
}
返回最近的位置;
}

这只是LINQ到对象集合还是LINQ到SQL?“我有一个对象集合”,问题的第一句话。;)我相信他的问题是排序(实际上不需要)需要很长时间。也许可以将SortedList集合作为您的数据结构。在linq中这样做不是有意义吗?这会是什么样的linq?代码示例?我可以使用不使用linq的解决方案。我只是在寻找“简单”。这正是MoreLINQ的
MinBy
方法的工作原理——正如dtb的答案所建议的那样。(虽然
MinBy
不能将提前退出作为精确匹配的特例。)如果您有一个已排序的集合,您可以有一个更好的提前退出。另外,如果使用“for”循环,则可以记住上次使用的索引,并从那里开始搜索,而不是从集合的开头开始搜索。简单与快速之间的良好平衡。这就是我最终选择做的,效果很好。