我有一个有趣的问题,我似乎无法找出lambda表达式来使这个工作.
我有以下代码:
List<string[]> list = GetSomeData(); // Returns large number of string[]'s
List<string[]> list2 = GetSomeData2(); // similar data, but smaller subset
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)...
归档时间: |
|
查看次数: |
26294 次 |
最近记录: |