假设我们有一个这样的数组:
var caps = new[] { "1512x", "001xx", "27058", "201xx", "4756x" };
(原始数组很大,来自另一个linq查询)
我需要创建一个接受值的LINQ语句,并尝试匹配foreseen数组中的一个值。
例如,如果我使用" 15121"我需要匹配" 1512x"数组上的值并返回它。 显然,如果我使用" 27058"它找到完全匹配并简单地返回它。
在LINQ中可以吗? "通配符"数组上的字符是" x",但我可以更改它。
提前致谢! 瓦莱里奥
答案 0 :(得分:6)
您可以使用正则表达式:
var value = "15121";
var caps = new[] { "1512x", "001xx", "27058", "201xx", "4756x" };
var match = caps
.FirstOrDefault(c => new Regex("^" + c.Replace("x", "[0-9]") + "$").IsMatch(value));
if (match != null)
Console.WriteLine("{0} matches {1}", value, match);
"模式" 001xx
转换为正则表达式^001[0-9][0-9]$
,依此类推。然后找到第一个匹配的正则表达式。
但是如果caps
很大,它可能表现不佳,因为每个正则表达式都必须编译并转换为状态机,直到找到匹配为止。
答案 1 :(得分:4)
假设你有一个谓词方法,就像这样(或使用Regex等效的东西,如另一个答案所述):
static bool Match(string pattern, string exact)
{
if(pattern.Length != exact.Length) return false;
for(var i = 0; i < pattern.Length; i++)
if(pattern[i] != exact[i] && pattern[i] != 'x')
return false;
return true;
}
然后LINQ查询看起来像这样:
var found = caps.Single(x => Match(x, yourSearch));