如何使用Distinct从Linq查询中选择特定对象?

时间:2010-05-19 11:43:10

标签: c# linq

我有一个包含两个或多个类Agent对象的列表。

名称=“A”

优先级= 0

ResultCount = 100

姓名=“B”

优先级= 1

ResultCount = 100

两个对象具有相同的ResultCount。在这种情况下,我只需要一个对象,而不是两个或更多。我使用带有Distinct的Linq查询和自定义的Comparer来完成此操作。

IEnumerable<Agent> distinctResultsAgents = 
(from agt in distinctUrlsAgents select agt).Distinct(comparerResultsCount);

使用此查询,我只从列表中获取一个对象,但我永远不知道哪一个。 但我不想要任何对象,我想要对象“B”,因为优先级高于对象“A”。 我怎么能这样做?

我的自定义Comparer非常简单,并且有这样的方法:

    public bool Equals(Agent x, Agent y)
    {
        if (x == null || y == null)
            return false;

        if (x.ResultCount == y.ResultCount)
            return true;

        return false;
    } 

1 个答案:

答案 0 :(得分:6)

首先按ResultCount对元素进行分组,这样您只能获得ResultCount的每个不同值的一个结果。然后为每个组选择该组中具有最高优先级的元素。

尝试此查询:

IEnumerable<Agent> distinctResultsAgents =
    from d in distinctUrlsAgents
    group d by d.ResultCount into g
    select g.OrderByDescending(x => x.Priority).First();

如果您使用morelinq,则可以使用名为MaxBy的函数代替最后一行,但请注意,它仅适用于LINQ To Objects。