LINQ在选择枚举时排除null

时间:2017-01-12 18:38:39

标签: c# linq

以下数据就是样本数据

ID  BatchName       File
===========================
1   Batch1          null 
2   Batch2          "C:\File2_1.pdf"
2   Batch2          "C:\File2_2.pdf"
3   Batch3          "C:\File3_1.pdf"
3   Batch3          "C:\File3_2.pdf"

然后我有一个代表上述数据的类

public class SourceBatch
{
   public int ID {get;set;}
   public string BatchName {get;set;}
   public string File {get;set;}
}

我希望按IDBatchName对其进行分组,然后将该组中的所有File选择到列表中。为此我有相应的班级

public class DestinationBatch
{
   public int ID {get;set;}
   public string BatchName {get;set;}
   public IEnumerable<string> Files {get;set;} // this is list of string
}

以下是执行该操作的代码

IList<SourceBatch> list = GetSourceList();

var result = list.GroupBy(x => new
{
    ID = x.ID,
    BatchName = x.BatchName
})
.Select(y => new DestinationBatch()
{
     ID = y.Key.ID,
     BatchName = y.Key.BatchName,
     Files = y.Select(z => z.File)
 }).ToList();

除了一个案例外,这个工作正常 对于Batch1其中File为空的Files,其填充Files属性具有一个空记录。我不想将空文件包含到{{1}}

2 个答案:

答案 0 :(得分:4)

添加Where子句。 Select将始终在IEnumerable中的每个项目上运行,并且必须返回一个值:

Files = y.Where( z => z.File != null).Select(s => s.File)

答案 1 :(得分:1)

比写简单:

Files = y.Select(z => z.File).Where(z=>z!=null)  

Select声明中

或事件更好:

Files = y.Select(z => z.File).Where(z=>!string.IsNullOrEmpty(z))