LINQ lambda表达式,查找属性为== X的子对象

时间:2014-05-21 12:57:18

标签: c# linq lambda

在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]]]

3 个答案:

答案 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元素返回IEnumerableRootObject个。这是因为您的查询为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();