结合多个Linq Where语句

时间:2015-12-08 09:49:48

标签: c# asp.net linq

我创建了一个过滤和排序列表内容的函数。

看起来有点“笨拙”,但Linq不强。我想知道这个功能是否可以简化,无论是从性能角度还是从审慎角度来看。

以下是代码:

//反序列化XML以创建一类活动行

    var agents = XmlHelper
        .Deserialise<AgentConfigs>("~/Pingtree.xml")
        .Agents
        .Where(x => x.IsActive == true);

//首先 - 获取'直接'代理并订购它们

    var direct = agents
        .Where(x => x.IsDirect)
        .OrderByDescending(x => x.MinPrice);

//秒 - 获取间接代理并订购它们

    var agency = agents
        .Where(x => !x.IsDirect)
        .OrderBy(x => x.Priority);

//将2个子列表固定在一起,保留顺序

    Agents = direct.Concat(agency).ToList();

有关如何改进的任何想法?

1 个答案:

答案 0 :(得分:5)

您可以使用GroupByToLookup来分割两者,在这种情况下我更喜欢ToLookup

var activeAgentDirectLookup = XmlHelper
    .Deserialise<AgentConfigs>("~/Pingtree.xml")
    .Agents
    .Where(x => x.IsActive == true)
    .ToLookup(a => a.IsDirect);

Agents = activeAgentDirectLookup[true].OrderByDescending(x => x.MinPrice)
    .Concat(activeAgentDirectLookup[false].OrderBy(x => x.Priority))
    .ToList();

在这种情况下,lookup类似于以bool为关键字的字典(因此有两个可能的组)。值为IEnumerable<Agents>,因此所有代理均为IsDirect!IsDirect。这里的好处是你只需要评估一次。