#c# #linq
#c# #linq
Вопрос:
Идея состоит в том, чтобы вернуть список бабушек и дедушек, у которых есть внуки с именем ‘Bob’
List<GrandParent> g_rents = new List<GrandParent>();
class GrandParent
{
public string Name { get; set; }
public List<Parent> l_rents { get; set; }
public GrandParent()
{
l_rents = new List<Parent>();
}
}
class Parent
{
public string Name { get; set; }
public List<Child> l_kids { get; set; }
public Parent()
{
l_kids = new List<Child>();
}
}
class Child
{
public string Name { get; set; }
}
Я пробовал 2 разных запроса:
var y = g_rents.Where( p => p.l_rents.l_kids.Any(o => o.Name == "Bob") );
Имеет ошибку:
'List<Parent>' does not contain a definition for 'l_kids' and no accessible extension method 'l_kids' accepting a first argument of type 'List<Parent>'
Этот запрос:
var x = g_rents.Where(g => g.l_rents.Where(h => h.l_kids.Select(i => i.Name=="Bob"));
Произошла ошибка:
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<bool>' to 'bool'
Я использую LINQ ровно настолько, чтобы знать, что, вероятно, в них не хватает чего-то простого, но я не могу понять, чего.
Спасибо!
Комментарии:
1. Вам нужно
Any
наl_rents
также в вашей первой попытке2. Привет, Ли. Не бойтесь использовать больше букв при описании свойств внутри классов. Например, вы можете использовать
KidsList
вместоl_kids
. Это более читабельно и более доступно для обслуживания.3. Спасибо CoolBots!!!
Ответ №1:
Вы почти на месте; вам также нужно Any
на l_rents
:
g_rents.Where(g => g.l_rents.Any(p => p.l_kids.Any(k => k.Name == "Bob")));
Логика заключается в следующем: «для каждого бабушки и дедушки g
в списке бабушек и дедушек g_rents
верните тех Where
Any
родителей p
, у которых в списке g
родителей g.l_rents
этого дедушки и бабушки есть Any
ребенок k
в списке детей этого соответствующего родителя p.l_kids
, которого зовут «Боб» ( k.Name == "Bob"
).
Ответ №2:
CoolBots прав. Вам нужен .Any()
там. Это то, что я сделал, но теперь я понимаю, что Where
‘ы не нужны. Я бы согласился с ответом CoolBots.
var grandParents = g_rents.Where(gp => gp.l_rents
.Where(p => p.l_kids
.Where(k => k.Name.Equals("Bob")).Any())
.Any()).ToList();
Я понятия не имел, что вы могли бы добавить лямбду Any
. Чем больше вы знаете…
Комментарии:
1. Смехотворно! Представьте, что принятый ответ — это тот, который говорит, что мой правильный!