LINQ搜索/匹配

时间:2014-12-23 11:24:21

标签: c# linq

假设我们有一个这样的数组:

 var caps = new[] { "1512x", "001xx", "27058", "201xx", "4756x" };

(原始数组很大,来自另一个linq查询)

我需要创建一个接受值的LINQ语句,并尝试匹配foreseen数组中的一个值。

例如,如果我使用" 15121"我需要匹配" 1512x"数组上的值并返回它。 显然,如果我使用" 27058"它找到完全匹配并简单地返回它。

在LINQ中可以吗? "通配符"数组上的字符是" x",但我可以更改它。

提前致谢! 瓦莱里奥

2 个答案:

答案 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));