我有一个方法,它的输入是一个文件地址列表,我想打开这个文件并处理它。此地址包含文件扩展名。我确定我有 3 个文件扩展名(txt、xlsx、xls)
在代码pathWithFilesName中输入文件路径列表;
然后我想将它们发送到将打开和处理它们的方法
pathWithFilesName.Add("ds.xlsx");
pathWithFilesName.Add("ds.txt");
var listExcel=new List<string>();
var listTxt= new List<string>();
var validExcelFileTypes = new List<string>{ ".xls", ".xlsx" };
foreach (var path in pathWithFilesName)
{
foreach (var valid in validExcelFileTypes)
{
if (path.EndsWith(valid))
{
listExcel.Add(path);
}
else
{
listTxt.Add(path);
}
}
}
这个变体根本不是最佳的,但有效) 我知道如何在链接上获取 excel 文件
var list= (from path in pathWithFilesName from valid in validExcelFileTypes where path.EndsWith(valid) select path).ToList();
但是使用这种方法,我需要比较 2 个列表。例如某种相交
制作样品的最佳方法是什么?
答案 0 :(得分:2)
这是使用 LinQ 和 lambda 的变体。它不应该更有效,而不是更好或更糟。它可能更具可读性。
listExcel
可以这样找到:
var listExcel = pathWithFilesName.Where(path=>validExcelFileTypes.Any(ext=> path.EndsWith(ext)));
如果您同时需要两个列表。您可以在相同条件下对源进行分组:
var listGrp = pathWithFilesName.GroupBy(path=>validExcelFileTypes.Any(ext=> path.EndsWith(ext)));
答案 1 :(得分:0)
您可以使用 MoreLinQ Partition
:“按谓词划分序列,..”。
var (listExcel, listTxt) = pathWithFilesName
.Partition(p =>
validExcelFileTypes.Any(ext => p.EndsWith(ext))
);
在引擎盖下,它只是一个 GroupBy
source code。展开为命名元组。