如何在Linq C中做到这一点#

时间:2018-02-23 22:34:35

标签: c# linq

到目前为止,我有这个:

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”等。

2 个答案:

答案 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,而不仅仅是两个字符串?