嵌套列表对象上的Lambda查询

时间:2020-03-08 00:38:16

标签: c# linq

我的数据结构如下:

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表达式。我不想去嵌套循环。

任何帮助都将非常有用。

1 个答案:

答案 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);
}

您可以在https://dotnetfiddle.net/

上尝试

注意:如果父属性为null,您还可以查看Null-conditional operators以确保子属性不执行。

我也会更好地命名您的班级类型。诸如A,B,C等名称的含义并不多,并且使读者难以理解这些类的作用和代表的含义。

相关问题