在C#中需要LINQ lambda表达式的帮助。
让我解释一下我的对象的结构。
RootObject是一个集合(具有多个属性的自定义类),它具有许多属性,其中一个是List<Item>
项。
物品包含List<Round>
轮。
Round包含EntryRID
(此ID是唯一的)和name
。
string = IDToFind = "111"; //The ID i want a Round object for
所以从我的&#34;项目列表&#34;我需要找到与给定ID(IDToFind)匹配的Round ID。 我需要在&#34;项目&#34;中搜索每个单一的项目。对于ID与IDToFind匹配的Round对象。
我已经厌倦了这句话:
Round playerRound = RootObject.Select(i => i.Items.Select(x => x.Rounds.Where(y => y.EntryRID == Int32.Parse(IDToFind))));
但它没有返回任何类型的对象,它返回:
System.Linq.Enumerable+WhereSelectListIterator`2[Leaderboards,System.Collections.Generic.IEnumerable`1[System.Collections.Generic.IEnumerable`1[Round]]]
答案 0 :(得分:3)
听起来你想要这样的东西:
// Parse the target ID *once* rather than all the time...
var targetId = int.Parse(IDToFind);
var playerRound = RootObject.SelectMany(i => i.Items)
.SelectMany(x => x.Rounds)
.Where(round => round.EntryRID == targetId)
.First();
这将返回匹配Round
的第一个,如果没有,则抛出异常。您可以使用FirstOrDefault
,如果没有匹配的对象,则返回null
,或者Single()
,这将确保完全一个结果。
作为查询表达式,您可以将上面的内容写为:
var targetId = int.Parse(IDToFind);
var playerRound = (from foo in RootObject // You haven't told us this type
from item in foo.Items
from round in item.Rounds
where round.EntryRID == targetId
select round).First();
答案 1 :(得分:2)
您的查询会为每个IEnumerable
元素返回IEnumerable
个RootObject
个。这是因为您的查询为IEnumerable
的每个项目生成RootObject
,并且结果也为IEnumerable
。
如果您想将结果展平为一个列表,请使用SelectMany
,如下所示:
var matchingItems = RootObject.SelectMany(i => i.Items.SelectMany(x => x.Rounds.Where(y => y.EntryRID == Int32.Parse(IDToFind))));
以上产生了一个可以迭代的集合:
foreach (var item in matchingItems) {
Console.WriteLine(item.ToString();
}
答案 2 :(得分:1)
你得到的结果是一个迭代器,即如果你在for循环中使用它,你可以迭代单个元素,如:
var element = RootObject.Select(i => i.Items.Select(x => x.Rounds.Where(y => y.EntryRID == Int32.Parse(IDToFind))));
for (var element in elements)
{ // do something with the element...}
如果您想立即查看整个列表,您还可以使用ToList()
方法获取所有元素并将其放入List
。
var list = element.ToList();