小编tim*_*rby的帖子

如何将LINQ分区为对象查询?

这是资源分配问题.我的目标是运行查询以获取任何时隙的最高优先级班次.

数据集非常大.对于这个例子,假设1000家公司各有100个班次(尽管真实数据集更大).它们都被加载到内存中,我需要对它们运行一个LINQ to Objects查询:

    var topShifts =
            (from s in shifts
            where (from s2 in shifts
                   where s2.CompanyId == s.CompanyId && s.TimeSlot == s2.TimeSlot
                   orderby s2.Priority
                   select s2).First().Equals(s)
            select s).ToList();
Run Code Online (Sandbox Code Playgroud)

问题在于,如果没有优化,LINQ to Objects将比较两个集合中的每个对象,进行所有1,000 x 100与1,000 x 100的交叉连接,这相当于100亿(10,000,000,000)个比较.我想要的是只比较每个公司内的对象(就像公司在SQL表中被索引一样).这将产生1000组100×100个对象,总计1000万(10,000,000)个比较.随着公司数量的增长,后者将线性扩展而不是指数级扩展.

I4o这样的技术可以让我做这样的事情,但不幸的是,我没有在我正在执行这个查询的环境中使用自定义集合的奢侈.此外,我只希望在任何给定的数据集上运行此查询一次,因此持久索引的值是有限的.我期望使用一种扩展方法,它可以按公司对数据进行分组,然后在每个组上运行表达式.

完整示例代码:

public struct Shift
{
    public static long Iterations;

    private int companyId;
    public int CompanyId
    {
        get { Iterations++; return companyId; }
        set { companyId = value; }
    }

    public int Id;
    public int TimeSlot;
    public int Priority;
}

class …
Run Code Online (Sandbox Code Playgroud)

.net c# indexing clr linq-to-objects

7
推荐指数
1
解决办法
1055
查看次数

标签 统计

.net ×1

c# ×1

clr ×1

indexing ×1

linq-to-objects ×1