Lambda表达式为列表中的每个不同值返回一个结果

时间:2014-03-20 13:10:16

标签: c# linq list lambda

我目前有一个很大的类对象列表,我目前正在使用以下lambda函数来返回满足条件的元素。

var call = callList.Where(i => i.ApplicationID == 001).ToList();

这将返回所有ID为001的对象列表。

我现在很好奇有什么不同的ApplicationID。所以我想要一个lambda函数来查看这个列表并返回一个列表,其中所有元素都有不同的ApplicationID,但只提取其中一个。

4 个答案:

答案 0 :(得分:19)

如果我理解你的问题,你可以尝试:

var list = callList.GroupBy(x => x.ApplicationID).Select(x => x.First()).ToList();

所以,如果你有一个像这样的清单:

AppID:1, AppID:1, AppID:2, AppID:2, AppID:3, AppID:3

将返回:

AppID:1 AppID:2 AppID:3

答案 1 :(得分:1)

您可以使用First或FirstOrDefault获取一个结果

var call = callList.First(i => i.ApplicationID == 001);

如果没有ApplicationID为001的调用exisrs,则会抛出异常。如果可以考虑使用:

var call = callList.FirstOrDefault(i => i.ApplicationID == 001);

如果不存在此类调用,则返回null,并且您可以在代码中进行相应处理。

要了解其他ApplicationId的存在,您可以查询:

var Ids = callList.Where(i => i.ApplicationID != 001).Select(i => i.ApplicationID).Distinct();

答案 2 :(得分:1)

有一种方法可以在查询中使用Distinct,但它会让您关注值的相等性。让我们假设您的类型称为CallClass并尝试:

class CallClass : IEqualityComparer<CallClass>
{

    public int ApplicationId { get; set; }

    //other propertiec etc.

    public bool Equals(CallClass x, CallClass y)
    {
        return x.ApplicationId == y.ApplicationId;
    }

    public int GetHashCode(CallClass obj)
    {
        return obj.GetHashCode();
    }
}

现在您可以清楚地查询值:

var call = callList.Distinct().ToList();

答案 3 :(得分:1)

你在说

  

我现在很好奇有什么不同的ApplicationID。所以我   想要一个lambda函数来查看这个列表并返回   一个列表,其中所有元素都具有不同的ApplicationID但仅限   取其中一个。

我认为这绝不是你真正想要的东西。你不关心关于元素,你关心所有,或者你关心特定的。很少(没有?)情况,你关心列表中的一个随机的。

在不知道您关心哪一个具体的情况下,我无法为您提供该版本的解决方案。 Allesandro为您提供了随机解决方案。

关心不同的ID时,您最终会

callList.Select(c => c.ApplicationID).Distinct()

只提供了所有ApplicationID。

如果你关心所有,你最终会

callList.GroupBy(c => c.ApplicationID)

这会给你一个IEnumerable<IGrouping<String, Thingy>>(其中Thingy是callList元素类型的类型。)

这意味着您现在拥有ApplicationID -> collection of Thingy's的集合。对于每个不同的ApplicationID,您将拥有具有该ApplicationID的每个元素的“List”(实际为IEnumerable

如果你关心Thingy的那个 - 例如 - 你想要的财产Foo值最低

callList.GroupBy(c => c.ApplicationID)
        .Select(group => group.OrderBy(thingy => thingy.Foo).First()))

这里你首先通过ApplicationID 分组它们,然后对于带有示例ApplicationID的每个东西列表,如果你 Order <选择它们中的第一个< / {>他们Foo