C# LINQ查询-使用IEnumerable取得副档名类型< string>

8iwquhpp  于 2022-12-06  发布在  C#
关注(0)|答案(4)|浏览(178)

我目前有一个方法,它递归枚举桌面上的所有文件,并将它们作为IEnumerable<string>返回。我现在要做的是创建一个方法,它将IEnumerable<string>作为参数,并使用LINQ按文件类型对它们进行分组/排序。我在获取文件类型时遇到了麻烦。经过试验,我得到了以下结果:

foreach(string file in files){
                FileInfo f = new FileInfo(file);
                Console.WriteLine(f.Extension);
                
}

我能够获取所有文件的扩展名,但不知道如何使用LINQ查询获取该信息

nkoocmlb

nkoocmlb1#

您可以使用GroupBy方法:

var files = new[] { "c://file1.txt", "c://file2.png", "c://file3.txt" };
var groups = files.Select(f => new FileInfo(f)).GroupBy(file => file.Extension, file => file, 
    (key, g) => new
{
    Extension = key, Files = g.OrderBy(f => f.Name).ToList()
});
foreach (var fileGroup in groups)
{
    var ext = fileGroup.Extension;
    var innerFiles = fileGroup.Files;
    Console.WriteLine($@"Files with extension {ext}: {innerFiles.Count} files");
}
nsc4cvqm

nsc4cvqm2#

订购:

List<string> listOrdered = files.OrderBy(x=>Path.GetExtension(x)).ToList()

至群组:

List<List<string>> listGroupped = files.GroupBy(x => Path.GetExtension(x))
            .Select(grp => grp.ToList())
            .ToList();

所以你有一个List<string>List,其中你有相同扩展名的所有文件。

8ljdwjyq

8ljdwjyq3#

我建议使用Dictionary<string, List<string>>而不是List<List<string>>

Dictionary<string, List<string>> filesByExtension =
    files
        .GroupBy(file => Path.GetExtension(file))
        .ToDictionary(group => group.Key, group => group.ToList());

// Then later you can get all files with a specific extension.
List<string> executableFiles = filesByExtension[".exe"];

// If you want to display them, ordered by file extension.
foreach (string fileExtension in filesByExtensions.Keys.OrderBy(key => key))
{
    List<string> files = filesByExtensions[fileExtension];
}
umuewwlo

umuewwlo4#

我会使用一个类似于字典的查找,但是值是一个可枚举的,所以如果你请求一个不包含的项(在本例中是一个文件扩展名),你永远不会得到异常:
获取桌面文件:

var desktopFiles = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory))
    .EnumerateFiles()
    .Concat(new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory)).EnumerateFiles());

下面是重要的代码,一行代码:

var extensionLookup = desktopFiles.ToLookup(file => file.Extension, StringComparer.InvariantCultureIgnoreCase);

现在用它把一些文件放入列表中。但是注意你也可以附加Count()来计算它们的数量,或者使用所有其他的LINQ方法:

var exeFiles = extensionLookup[".exe"].ToList(); // empty on my desktop
var txtFiles = extensionLookup[".txt"].ToList();
var inkFiles = extensionLookup[".ink"].ToList();

您还可以按文件类型循环所有可用文件:

foreach(var x in extensionLookup)
{
    Console.WriteLine($"Extension: {x.Key} File-Count: {x.Count()}");
    Console.WriteLine($"All Files: {string.Join(Environment.NewLine, x.Select(f => f.Name))}");
}

相关问题