【问题标题】:Seeking efficient linq method in searching matched string寻找匹配字符串的高效linq方法
【发布时间】:2012-02-15 23:55:33
【问题描述】:

我有一个字符串数组,里面有三个字段,分别是field1、field2、field3。 field1 和 field2 的长度都是 1。field3 的长度可以是 0 并且没有限制,通常是 0 到 6。我要做的是在给 field1、field2 和 field3 字符串时,在数组中找到匹配的字符串。由于 field1 和 field2 的长度都是 1,所以它们必须完全匹配。但是对于field3,只要匹配一个char,就匹配。

例如:

  array[0]="AB:CDE"
  array[1]="BA:D"
  array[2]="CA:EFG"
  array[3]="DE:ABEFG"

如果给我三​​个字段字符串:C、A、FG,那么它匹配数组[2] D, E, B, 匹配数组[3]

如何使用 Linq 进行搜索?考虑到数组可以是任何格式。 我正在使用 C#

【问题讨论】:

  • 任何代码都可以显示为this doesn't work ?
  • 我是否正确理解此示例数组的每个元素的格式类似于[Field1][Field2]:[Field3]?
  • 这只是一个示例格式。为了给样品。格式可以设置为您喜欢的任何格式。

标签: c# linq


【解决方案1】:

我不确切知道您想要的结果如何,但这里有一个方法,它返回与您的三个字段匹配的模式数组:

string[] Patterns = new[] { "AB:CDE", "BA:D", "CA:EFG", "DE:ABEFG" };
string Field1 = "C";
string Field2 = "A";
string Field3 = "FG";

string[] Results = MatchPatterns(Patterns, Field1, Field2, Field3);

Console.WriteLine("Matching patterns:");
foreach (string r in Results)
    Console.WriteLine(r);

private string[] MatchPatterns(string[] patterns, string f1, string f2, string f3)
{
    return patterns.Where(c => f1 == c.Substring(0, 1) && f2 == c.Substring(1, 1) && c.Substring(3).Contains(f3)).ToArray();
}

编辑:

重新阅读您的问题,我想知道模式 CA:EFG 是否改为 CA:EG 是否仍与您的前三个示例字段匹配?你说只要在字段 3 中有一个字符匹配,就应该被认为是匹配的。

这意味着如果字段 3 是 FG,由于模式包含 G,它应该是匹配的。

如果这个是你想要的功能,把上面的方法换成这个:

private string[] MatchPatterns2(string[] patterns, string f1, string f2, string f3)
{
    return patterns.Where(c => f1 == c.Substring(0, 1) &&
        f2 == c.Substring(1, 1) &&
        c.Substring(3).Any(x => f3.Any(f => f == x))).ToArray();
}

【讨论】:

  • 太棒了!! MatchPatterns2 方法正是我正在寻找的。显然,到目前为止,只有您提供了正确的答案。非常感谢。
  • 这假定了上面提到的[f1][f2]:[f3] 格式,对吗?
  • @Liquid 正确,应更改子字符串位置以适应不同的格式。
【解决方案2】:

假设您的密钥格式相同,这是您要寻找的结果吗? (我并不是说这是最优的,只是一个起点)。

array.ToList().Where(x => x.StartsWith(key.Substring(0, 2)) && x.Substring(3).Contains(key.Substring(3)));

【讨论】:

    【解决方案3】:

    这是我的解决方案

    string field1 = "C";
    string field2 = "A";
    string field3 = "FG";
    
    var result = array.Where(s => s[0] == field1[0] &&
                                  s[1] == field2[0] && 
                                  s.Substring(2).Contains(field3));
    

    【讨论】:

      【解决方案4】:

      可能是这样的:

      var arr = new string[4];
      
      
      
              arr[0] = "AB:CDE";
              arr[1] = "BA:D";
              arr[2] = "CA:EFG";
              arr[3] = "DE:ABEFG";
      
              arr.ToList().Where(a => a.Contains("C") & a.Contains("A") & a.Contains("FG")).ToList().ForEach(a => Console.WriteLine(a));
              Console.ReadKey();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2012-09-14
        • 2017-10-11
        • 1970-01-01
        • 2018-01-09
        相关资源
        最近更新 更多