使用 C# 4.8:从字符串数组或字符串列表中删除与字符串模式匹配的项的最有效方法

Using C# 4.8: Most efficient way to remove items matching string patterns from a string array or string list

我需要从列表中删除与字符串模式集合相匹配的项目。如果需要,我可以遍历 list/array 模式来删除而不是一次匹配所有模式。

注意:字符串模式是动态的,我们不知道会传入什么。
我们确实知道这些模式可以有星号 and/or 问号,并且具有与以下相同的功能:

System.IO.Directory.GetFiles(, );

其中 ?xyz.txt 会找到 1xyz.txt2xyz.txt,但不会找到 12xyz.txt,也不会找到 xyz.txt

这是我想出来的,但行不通。

string exclude = "*yf*";
List<string> listRemaining = listAll.Where(x => !listAll.Contains(exclude)).ToList();

这是要从列表中删除的项目的模式示例:

*yf*

*xName.txt

?MyFileName*

这是一个示例字符串列表,我们需要从中删除与上述 3 种模式匹配的项目:

AyFileName.log
AyFilexName.txt
ByFilexName.log
ByFileName.txt
zMyFileName.log
zMyFileName.txt
SomeFancyFileName.log
SomeFancyFileName.txt
TodayFileName.log
TodayFileName.txt
UglyFileName.log
UglyFileName.txt

要删除的项目?

要删除的模式:*yf*

将删除:

`SomeFancyFileName.log`
`SomeFancyFileName.txt`
`UglyFileName.log`
`UglyFileName.txt`

要删除的模式:*xName.txt

将删除: AyFilexName.txt

要删除的模式:?MyFileName*

将删除: zMyFileName.log zMyFileName.txt

谢谢。

最好的解决方案是@jwdonahue 提到的文件通配。

https://docs.microsoft.com/en-us/dotnet/core/extensions/file-globbing

但如果您想为此构建自己的解决方案,这可能是一个开始。

public static IEnumerable<string> Filter(string pattern, IEnumerable<string> list) {
    return list.Where(e =>!Match(pattern, e));
}

public static bool Match(string pattern, string input) {
    var modifiedPattern = pattern
        .Replace(@"\", @"\")
        .Replace(".", @"\.")
        .Replace("*", ".*")
        .Replace("?", ".");
    modifiedPattern = "^" + modifiedPattern + "$";
    return Regex.IsMatch(input, modifiedPattern, RegexOptions.IgnoreCase);
}

你可以这样称呼

    var filterPattern = "?MyFileName*";
    var listRemaining = Filter(filterPattern, listAll).ToList();