使用lambda表达式获取数组元素相等的子集

Eri*_*sch 5 c# lambda

我有一个有趣的问题,我似乎无法找出lambda表达式来使这个工作.

我有以下代码:

List<string[]> list = GetSomeData(); // Returns large number of string[]'s
List<string[]> list2 = GetSomeData2(); // similar data, but smaller subset
&nbsp;
List<string[]> newList = list.FindAll(predicate(string[] line){ 
    return (???);
});
Run Code Online (Sandbox Code Playgroud)

我想只返回列表中的那些记录,其中每个字符串[]的元素0等于list2中的元素0之一.

list包含这样的数据:

"000", "Data", "more data", "etc..."
Run Code Online (Sandbox Code Playgroud)

list2包含这样的数据:

"000", "different data", "even more different data"
Run Code Online (Sandbox Code Playgroud)

从根本上说,我可以像这样编写这样的代码:

List<string[]> newList = new List<string[]>();
foreach(var e in list)
{
    foreach(var e2 in list2)
    {
        if (e[0] == e2[0])
            newList.Add(e);
    }
}
return newList;
Run Code Online (Sandbox Code Playgroud)

但是,我正在尝试使用泛型和lambda,所以我正在寻找一个很好的清洁解决方案.这个让我很沮丧..也许是在查找内部查找?

编辑:Marc的回答让我尝试了一个看起来像这样的变形:

var z = list.Where(x => list2.Select(y => y[0]).Contains(x[0])).ToList();
Run Code Online (Sandbox Code Playgroud)

我不确定这是多么高效,但它有效并且足够简洁.其他人有什么建议吗?

Mar*_*ell 11

你可以加入吗?不过,我自己会用两个步骤:

var keys = new HashSet<string>(list2.Select(x => x[0]));
var data = list.Where(x => keys.Contains(x[0]));
Run Code Online (Sandbox Code Playgroud)

如果你只有.NET 2.0,那么要么安装LINQBridge并使用上面的内容(或类似的,Dictionary<>如果LINQBridge不包含HashSet<>),或者使用嵌套Find:

var data = list.FindAll(arr => list2.Find(arr2 => arr2[0] == arr[0]) != null);
Run Code Online (Sandbox Code Playgroud)

注意虽然Find方法是O(n*m),其中 - HashSet<>方法是O(n + m)...