我目前有一个类对象的大列表,我目前使用下面的lambda函数来返回满足条件的元素。
var call = callList.Where(i => i.ApplicationID == 001).ToList();
这将返回id都为001的对象列表。
我现在很好奇有什么不同的applicationid。所以我想要一个lambda函数,它将查看这个列表并返回一个列表,其中所有元素都有不同的ApplicationID,但只获取其中一个。
如果我理解你的问题,你可以试试:
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
您可以使用First或FirstOrDefault返回一个结果
var call = callList.First(i => i.ApplicationID == 001);
如果ApplicationID为001的调用不存在,这将抛出异常。如果预期会出现这种情况,可以考虑使用:
var call = callList.FirstOrDefault(i => i.ApplicationID == 001);
在这里,如果不存在这样的调用,则返回null,您可以在代码中相应地处理。
要查找存在的其他ApplicationId,您可以查询:
var Ids = callList.Where(i => i.ApplicationID != 001).Select(i => i.ApplicationID).Distinct();
你在说
我现在很好奇有什么不同的applicationid。所以我想要一个lambda函数来查看这个列表并返回吗一个列表,其中所有元素都有不同的ApplicationID,但只有获取其中一个。
我想说的是,这绝对不是你真正想要的。你要么不关心元素,你关心所有元素,要么你关心一个特定的元素。很少(没有?)情况下,您需要从列表中随机选择一个。
如果不知道你关心的具体是哪个版本,我无法给你那个版本的解决方案。alesandro已经给了你一个随机的解决方案。
当你只关心不同的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,您将有一个"列表"(实际上是IEnumerable
)的每个元素,具有该ApplicationID
如果您关心的Thingy
-例如-具有属性Foo的最低值,您将希望
callList.GroupBy(c => c.ApplicationID)
.Select(group => group.OrderBy(thingy => thingy.Foo).First()))
在这里你首先组通过ApplicationID,然后为每一个事物的列表与样例ApplicationID你选择他们中的第一个如果你顺序他们通过Foo
有一种方法可以在查询中使用Distinct
,但它会使您注意值的相等性。让我们假设您的类型名为CallClass,并尝试:
class CallClass : IEqualityComparer<CallClass>
{
public int ApplicationId { get; set; }
//other properties 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();