我的数据结构如下:
class A
{
List<B> data;
}
class B
{
C data;
}
class C
{
List<E> data;
}
class E
{
int Id;
string Name;
}
function GetEById(int id, List<A> data)
{
}
现在,我需要构建一个Id =某些东西的Linq Lambda表达式。我不想去嵌套循环。
任何帮助都将非常有用。
答案 0 :(得分:1)
假设您的课程如下所示:
public class A
{
public List<B> Data { get; set; }
}
public class B
{
public C Data { get; set; }
}
public class C
{
public List<E> Data { get; set; }
}
public class E
{
public int Id { get; set; }
public string Name { get; set; }
}
您可以创建方法GetEById
,该方法使用Enumerable.SelectMany()
展平结果并选择与ID与Enumerable.FirstOrDefault()
匹配的第一个E
对象:
private static E GetEById(int id, IEnumerable<A> data)
{
return data
?.SelectMany(a => a?.Data?.SelectMany(b => b?.Data?.Data))
.FirstOrDefault(e => e?.Id == id);
}
或者您可以将所有E
个对象收集到Enumerable.Where()
进行的IEnumerable<E>
过滤中:
private static IEnumerable<E> GetAllEById(int id, IEnumerable<A> data)
{
return data
?.SelectMany(a => a?.Data?.SelectMany(b => b?.Data?.Data))
.Where(e => e?.Id == id);
}
上尝试
注意:如果父属性为null
,您还可以查看Null-conditional operators以确保子属性不执行。
我也会更好地命名您的班级类型。诸如A,B,C等名称的含义并不多,并且使读者难以理解这些类的作用和代表的含义。