我需要從串列中洗掉與字串模式集合匹配的專案。如果需要,我可以遍歷模式串列/陣列以洗掉而不是一次匹配所有模式。
注意:字串模式是動態的,我們不知道會傳入什么。
我們知道模式可以有星號和/或問號,并且具有與以下相同的功能:
System.IO.Directory.GetFiles(, );
在哪里?xyz.txt可以找到1xyz.txt, 2xyz.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
謝謝你。
uj5u.com熱心網友回復:
最好的解決方案是@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();
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468875.html
上一篇:如何以特定概率遍歷串列?
