LINQ - 按子集的结果排序

时间:2013-04-19 22:00:37

标签: linq

修改

我将说明我正在努力解决的确切问题。简化的问题解释无效。

我正在编写一个框架,要求我根据负载因子为CPU内核分配线程。请不要争论我为什么要这样做。

框架启动时,它会形成以下硬件的映射:

  1. 第1级:处理器工作组。
  2. 第2级:NUMA节点。
  3. 第3级:处理器(插座)。
  4. 第4级:核心。
  5. 第5级:逻辑处理器(仅适用于SMT系统)。
  6. 我用相当复杂的5级层次结构代表它。

    用户可以查询此硬件信息。用户可以指定任何内容,所需的工作组,所需的NUMA节点等,直到4级。在这种情况下,框架只是过滤掉完整的数据集,只返回与输入匹配的内容,只要它符合层次结构(即用户没有说明指定处理器下没有出现的内核)。

    接下来,用户指定范围,例如“给我任意1个工作组,任何1个numa节点和任何3个CPU”。在这种情况下,框架应返回具有最低赋值的3个CPU。这是一个过滤器&排序过程。

    同样,用户可以将他的过滤器指定为任何级别。

    用户也可以简单地指定任何内容,这意味着框架必须返回硬件信息,但是根据每个级别的负载分配进行排序。

    这个过程总是过滤&无论用户指定什么,都要排序。唯一的区别是用户可以指定范围,计数或什么都不是。

    要开始此过程,我会根据用户提供的信息过滤原始硬件数据。这将作为每个L5对象的对象{L1,L2,L3,L4,L5)的扁平枚举返回。

    接下来,我执行以下操作:

    IEnumerable<KeyValuePair<int, double>> wgSub;
    IEnumerable<KeyValuePair<int, double>> nnSub;
    IEnumerable<KeyValuePair<int, double>> cpSub;
    IEnumerable<KeyValuePair<int, double>> coSub;
    
    wgSub = (
            from n in query
            group n by n.L1.ID into g
            select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L1.Assignment))
        )
        .OrderBy(o => o.Value);
    
    nnSub = (
            from n in query
            group n by n.L2.ID into g
            select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L2.Assignment))
        )
        .OrderBy(o => o.Value);
    
    cpSub = (
            from n in query
            group n by n.L3.ID into g
            select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L3.Assignment))
        )
        .OrderBy(o => o.Value);
    
    coSub = (
            from n in query
            group n by n.L4.ID into g
            select new KeyValuePair<int, double>(g.Key, g.Sum(n => n.L4.Assignment))
        )
        .OrderBy(o => o.Value);
    
    query = (
                from n in query
                join wgj in wgSub on n.L1.ID equals wgj.Key
                join nnj in nnSub on n.L2.ID equals nnj.Key
                join cpj in cpSub on n.L3.ID equals cpj.Key
                join coj in coSub on n.L4.ID equals coj.Key
                select n
            )
            .OrderBy(o => o.L1.ID == wgSub.Key)
            .ThenBy(o => o.L2.ID == nnSub.Key)
            .ThenBy(o => o.L3.ID == cpSub.Key)
            .ThenBy(o => o.L4.ID == coSub.Key);
    

    我被困在订单上(这将是4级深)。我需要按每个子查询中的ID对输入查询进行排序,然后“接下来”,等等。我写的不正确。

    如果用户指定了范围或计数(均表示数量),我还需要实现Take,可能是每个级别。

1 个答案:

答案 0 :(得分:1)

我不太清楚你的目标是什么,但是它会是这样的吗?

query = query
   .OrderBy(n => wgSub.First(g => g.Key == n.L1.ID).Value)
   .ThenBy(n => nnSub.First(g => g.Key == n.L1.ID).Value)
   ...