填充列表 <string> 的最佳方法是什么?

时间:2021-04-07 05:55:06

标签: c# .net

我有一个方法,它的输入是一个文件地址列表,我想打开这个文件并处理它。此地址包含文件扩展名。我确定我有 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 个列表。例如某种相交

制作样品的最佳方法是什么?

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。展开为命名元组。

Live demo