在搜索匹配的字符串时寻求有效的linq方法

时间:2012-02-15 23:55:34

标签: c# linq

我有一个字符串数组,它有三个字段,分别是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#

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

这是我的解决方案

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

答案 2 :(得分:0)

我不确切地知道你想要的结果,但是这里有一个方法可以返回一个与你的三个字段匹配的模式数组:

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();
}

答案 3 :(得分:-1)

或许这样的事情:

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();