以下数据就是样本数据
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;}
}
我希望按ID
和BatchName
对其进行分组,然后将该组中的所有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}}
答案 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))