1

私にはList<Person>(人)がいますすべての人にはList<Kid>(子供)がいます

5歳未満の子供を持つすべての人を見つけたい場合は、次のようにします

var peopleWithLittleKids=new List<Person>()

foreach(var p in people)
{
    foreach(var kid in p.Kids)
    {
        if(kid.age<5)
        {
            peopleWithLittleKids.Add(p);
            break;
        }
    }
}

ラムダを使用してこれを行う1行の方法はありますか?

4

3 に答える 3

9

人々が複数の子供を持つことを許可されていると仮定すると...[ここに政治声明を挿入...]

people.Where(p => p.Kids.Any(k => k.age < 5))
于 2013-01-21T22:44:24.350 に答える
5

Enumerable.WhereおよびAny拡張メソッドを使用できます。

var peopleWithLittleKids = people.Where(p => p.Kids.Any(k => k.age < 5)).ToList();

結果にを必要としないため、ToList()(を介して)結果を反復処理するだけの場合は、省略できることに注意してください。foreachList<T>

また、ループアプローチでは、Person一致する子が複数ある場合、リストにaが複数回追加されます。この機能を複製したい場合は、次の方法で行うことができます。

var peopleWithLittleKidsContainingDuplicates = people
               .SelectMany(p => p.Kids.Where(k => k.Age < 5).Select(k => p));

(これはおそらくあなたが望むものではなく、オリジナルのバグですが、これはオリジナルのコードと一致します...)

于 2013-01-21T22:44:00.903 に答える
2

ラムダだけでは問題を解決できません。LINQは、必要なことを実行するのに役立つテクノロジーです。

var peopleWithLittleKids = people.Where(p => p.Kids.Any(k => k.age < 5).ToList();
于 2013-01-21T22:43:59.427 に答える