当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用lambda表达式获取数组元素相等的子集》经验,为你挑选了1个好方法。

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

我有以下代码:

List list = GetSomeData(); // Returns large number of string[]'s
List list2 = GetSomeData2(); // similar data, but smaller subset
 
List newList = list.FindAll(predicate(string[] line){ 
    return (???);
});

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

list包含这样的数据:

"000", "Data", "more data", "etc..."

list2包含这样的数据:

"000", "different data", "even more different data"

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

List newList = new List();
foreach(var e in list)
{
    foreach(var e2 in list2)
    {
        if (e[0] == e2[0])
            newList.Add(e);
    }
}
return newList;

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

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

var z = list.Where(x => list2.Select(y => y[0]).Contains(x[0])).ToList();

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



1> Marc Gravell..:

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

var keys = new HashSet(list2.Select(x => x[0]));
var data = list.Where(x => keys.Contains(x[0]));

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

var data = list.FindAll(arr => list2.Find(arr2 => arr2[0] == arr[0]) != null);

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

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有