Linq检查字符串数组是否在其他数组中具有部分匹配

时间:2015-09-12 00:17:27

标签: c# arrays algorithm linq

我想返回在array1

中找到的一串匹配项
public static string[] FindMatchs(string[] array1, string[] array2) {
    return array1.Where(x => array2.Contains(x)).ToArray();
}

输入:

var a1 = new string[] { "ca", "tr", "stack" };
var a2 = new string[] { "car", "house", "tree", "stackoverflow", "bus" };

该方法应返回“ca”,“tr”,“stack”

3 个答案:

答案 0 :(得分:2)

我在之前的代码中犯了一个错误。 请参阅下面的工作示例。

您希望使用.Contains()和.Any()的组合来实现您的目标。

以下是基于您的代码的代码示例,该示例应该有效(为了清晰起见,签名中的名称已经更改):

public static string[] FindMatchs(string[] array, string[] filter) {
    return array.Where(x => filter.Any(y => x.Contains(y))).ToArray();
}

以下是它的实例: https://dotnetfiddle.net/HdB79V

答案 1 :(得分:0)

以下示例返回两个列表中的匹配项:

public class names
{
  public int ID {get;set;}
  public string Name {get;set;}
}

List<names> l1 = new List<names>();
List<names> l2 = new List<names>();

填充两个列表:

例如

   Name xyz = new Name()
    xyz.id = 1;
    xyz.name = "blah";
    l1.Add(xyz)

var matches = (from l1 in list1
        join l2 in list2 on l1.Name equals l2.Name
        select sp).ToList();

如果您只想使用数组

var list1 = new string[] {"xyz", "abc"};
var list2 = new string[] {"abc"};
var matches = list1.Intersect(list2);
foreach (string s in matches)
{
 //s will return common 

}

答案 2 :(得分:0)

你几乎就在那里......你方法中的线稍有变化。

return array1.Where(x => array2.Any(y=>y.Contains(x))).ToArray();