C# 搜索匹配字符串时寻找有效的linq方法

C# 搜索匹配字符串时寻找有效的linq方法,c#,linq,C#,Linq,我有一个字符串数组,它有三个字段,分别是field1,field2,field3。 字段1和字段2的长度均为1。字段3的长度可以是0且不受限制,通常为0到6。我想做的是,当给出field1、field2和field3字符串时,在数组中查找匹配的字符串。因为field1和field2的长度都是1,所以它们必须完全匹配。但是对于field3,只要它匹配一个字符,它就匹配 例如: array[0]="AB:CDE" array[1]="BA:D" array[2]="CA:EFG" a

我有一个字符串数组,它有三个字段,分别是field1,field2,field3。 字段1和字段2的长度均为1。字段3的长度可以是0且不受限制,通常为0到6。我想做的是,当给出field1、field2和field3字符串时,在数组中查找匹配的字符串。因为field1和field2的长度都是1,所以它们必须完全匹配。但是对于field3,只要它匹配一个字符,它就匹配

例如:

  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#

可能是这样的:

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

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

这是我的解决办法

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

我不知道您希望得到什么样的结果,但这里有一个方法,它返回一个匹配三个字段的模式数组:

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

任何类似于
的代码都不起作用
?我是否正确理解此示例数组的每个元素的格式类似于
[Field1][Field2]:[Field3]
?这只是一个示例格式。为了给样品。格式可以设置为您喜欢的任何格式。太好了!!MatchPatterns 2方法正是我要寻找的。显然,到目前为止,只有你提供了一个正确的答案。非常感谢。这假设上面提到的
[f1][f2]:[f3]
格式正确吗?@Liquid correct,子字符串位置应该更改以适应不同的格式。
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();
}