到目前为止,我有这个:
var v = Directory.EnumerateFiles(_strConfigurationFolder)
.GroupBy(x => GetReportName(Path.GetFileNameWithoutExtension(x)));
配置文件夹将包含多对文件:
abc.json
abc-input.json
def.json
def-input.json
GetReportName()方法剥离了“-input”和标题情况下的文件名,因此最终得到的分组为:
Abc
abc.json
abc-input.json
Def
def.json
def-input.json
我有一个ReportItem类,它有一个构造函数(Name,str1,str2)。我想扩展Linq以在单个语句中创建ReportItems,所以真的像:
var v = Directory.EnumerateFiles(_strConfigurationFolder)
.GroupBy(x => GetReportName(Path.GetFileNameWithoutExtension(x)))
**.Select(x => new ReportItem(x.Key, x[0], x[1]));**
显然最后一行不起作用,因为分组不支持这样的数组索引。该项目应构造为“Abc”,“abc.json”,“abc-input.json”等。
答案 0 :(得分:3)
如果您知道每个感兴趣的组只包含两个项目,请使用First()
获取索引0处的项目,使用Last()
获取索引1处的项目:
var v = Directory.EnumerateFiles(_strConfigurationFolder)
.GroupBy(x => GetReportName(Path.GetFileNameWithoutExtension(x)))
.Where(g => g.Count() == 2) // Make sure we have exactly two items
.Select(x => new ReportItem(x.Key, x.First(), x.Last()));
答案 1 :(得分:3)
var v = Directory.EnumerateFiles(_strConfigurationFolder)
.GroupBy(x => GetReportName(Path.GetFileNameWithoutExtension(x))).Select(x => new ReportItem(x.Key, x.FirstOrDefault(), x.Skip(1).FirstOrDefault()));
但是你确定每组中只有两个项目吗?也许让ReportItem接受IEnumerable,而不仅仅是两个字符串?