我有一个List <>,其中包含另一个List <>
我需要查找最内层列表中的任何项目中是否存在给定值.如果找到匹配,我需要该特定项目并返回.
我这样做如下所示:
InnerList inner = null;
foreach(TopList in topListItems)
{
inner = asn.Owners.Find(x => x.GuestId == guestId);
if(inner != null)
break;
}
//item found if inner is not null
//else item absent in the inner list
Any other alternate way that may run faster than this?
Run Code Online (Sandbox Code Playgroud)
编辑: 一些更正:我只需要看看内部列表是否有一个具有特定值的项目.如果是,那么我需要返回具有匹配项的顶级项目.我猜逻辑是一样的.
这将是我如何使用Linq实现这一目标.
var answer = from topList in TopListItems
from innerListItem in topList.InnerList
where innerListItem.GuestId == guestId
select topList;
Run Code Online (Sandbox Code Playgroud)
或根据Claytons评论使用Lambdas
var answer = TopListItems.FirstOrDefault(topList =>
topList.InnerList.Any(innerList =>
innerList.GuestId == guestId));
Run Code Online (Sandbox Code Playgroud)
但是,使用GuestId重构使用键控字典会更快.
如果您想保留数据结构,那么我看到的唯一改进就是放弃基于委托的搜索和手动搜索。我预计这会带来约二倍的改善。
foreach(var innerList in outerList)
{
foreach(var item in innerList)
{
if(item.GuestId == guestId)
return innerList;
}
}
return null;
Run Code Online (Sandbox Code Playgroud)
如果可能的话,您可以以某种方式使用字典。但我对你的问题了解不够,无法告诉你这是否可能。这可以带来非常大的加速,因为在字典中按键搜索是 O(1) 而不仅仅是 O(n)。
在某些情况下for,循环可能会比循环稍微加速foreach,但我不知道这是否是其中之一。所以你需要进行基准测试。