有没有一种方法可以组合List.Contains()和string.StartsWith()?

时间:2020-03-31 16:34:40

标签: c#

我有一个文件名列表,我要检查是否存在重复的文件名,但扩展名不同

示例: Randomfilename.xlsx和Randomfilename.pptx

我的方法如下:

string tempFileName = originalFilename.Remove(file.LastIndexOf("."));
if (allFilesInDirectory.Contains(  string that starts with tempFileName  ))

但是我不认为有这个确切的功能。有什么解决方法?

4 个答案:

答案 0 :(得分:4)

您可以使用LINQ Any函数

allFilesInDirectory.Any(s => s.StartsWith(tempFileName))

或者如果您要查找元素

var file = allFilesInDirectory.FirstOrDefault(s => s.StartsWith(tempFileName));

编辑

没有LINQ

allFilesInDirectory.FindAll(s => s.StartsWith(tempFileName)).Count > 0

var fileName = allFilesInDirectory.Find(s => s.StartsWith(tempFileName));

答案 1 :(得分:4)

像这样吗?

var filenamesGrouped = allFilesInDirectory.GroupBy(x => Path.GetFileNameWithoutExtension(x));
var duplicates = filenamesGrouped.Count() > 1;

答案 2 :(得分:3)

您可以在此处使用LINQ对具有相同文件名的所有文件进行分组,并过滤​​具有多个重复文件名的组:

var duplicates = Directory
    .GetFiles(path)
    .GroupBy(f => Path.GetFileNameWithoutExtension(f))
    .Where(grp => grp.Count() > 1);

以上方法使用Directory.GetFiles()列出目录中的文件,使用Enumerable.GroupBy()分组不带扩展名的文件,可以使用Path.GetFileNameWithoutExtension()将其提取。然后,您可以使用Enumerable.Where()过滤组。

演示:

var duplicates = Directory
    .GetFiles(path)
    .GroupBy(f => Path.GetFileNameWithoutExtension(f))
    .Where(grp => grp.Count() > 1);

foreach (var fileGroup in duplicates)
{
    Console.WriteLine($"{fileGroup.Key} : {string.Join(", ", fileGroup.Select(f => Path.GetFileName(f)))}");
}

输出:

Randomfilename : Randomfilename.csv, Randomfilename.txt

如果您要像问题中那样检查特定的文件名:

var duplicates = Directory
    .GetFiles(path)
    .Where(f => Path.GetFileNameWithoutExtension(f) == "Randomfilename");

if (duplicates.Count() > 1)
{
    // We found duplicates
}

我们还可以包装成一个方法:

private static bool FileHasDuplicates(string path, string filename)
{
    return Directory
        .GetFiles(path)
        .Where(f => Path.GetFileNameWithoutExtension(f) == filename)
        .Count() > 1;
}

如果还要扫描给定目录的所有子目录,则可以使用Directory.EnumerateFiles()

var duplicates = Directory
    .EnumerateFiles(path, "*", SearchOption.AllDirectories)
    .GroupBy(f => Path.GetFileNameWithoutExtension(f))
    .Where(grp => grp.Count() > 1);

答案 3 :(得分:2)

您可以对allFilesInDirectory进行排序并进行迭代。在排序列表中检查是否有彼此相邻的元素以匹配文件名(不带扩展名)。