我有一个有趣的问题,我似乎无法找出lambda表达式来使这个工作.
我有以下代码:
Listlist = 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"
从根本上说,我可以像这样编写这样的代码:
ListnewList = 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();
我不确定这是多么高效,但它有效并且足够简洁.其他人有什么建议吗?
你可以加入吗?不过,我自己会用两个步骤:
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)...