Linq从自定义嵌套对象列表中选择项目列表

时间:2017-11-06 11:20:20

标签: c# linq

我为我的应用程序创建了以下对象模型

public class Object
{
    public List<Node> Nodes { get; set; }
}

public class Node
{
    public InstrumentData InstrumentData { get; set; }        
}

public class InstrumentData
{       
    public List<MySysData> MySysDataList { get; set; }
}

public class MySysData
{       
    public string SystemName { get; set; }        
}

现在我有对象的节点列表。我想选择not null&#34; SystemName&#34;从对象节点列表到字符串列表
我已经尝试过以下查询,但仍然没有预料到。

 var test = Object.Nodes.ToList<Node>()
  .Select(x => x.InstrumentData?.MySysDataList.ToList<MySysData>()
  .Select(y => y.SystemName)
  .ToList()) ;

2 个答案:

答案 0 :(得分:2)

您需要WhereSelectMany

List<string> sysNameList = Object.Nodes
   .Where(x => x.InstrumentData?.MySysDataList != null)
   .SelectMany(x => x.InstrumentData.MySysDataList
       .Select(y => y.SystemName)
       .Where(sName => sName != null))
   .ToList();

如果您想在最终Distict之前删除ToList之前的重复项。

答案 1 :(得分:0)

如果您只想要系统名称,那么因为您的内部选择返回一个列表(所以最终输出是一个列表列表),您需要使用SelectMany来“压扁”列表。只要事情可以枚举,您也不需要一直重复使用ToList()。我认为这样的事情应该有效:

var test = Object.Nodes
    .SelectMany(x => x.InstrumentData?.MySysDataList.Select(y => y.SystemName))
    .ToList();