我目前有一个很大的类对象列表,我目前正在使用以下lambda函数来返回满足条件的元素。
var call = callList.Where(i => i.ApplicationID == 001).ToList();
这将返回所有ID为001的对象列表。
我现在很好奇有什么不同的ApplicationID。所以我想要一个lambda函数来查看这个列表并返回一个列表,其中所有元素都有不同的ApplicationID,但只提取其中一个。
答案 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