在C#中搜索嵌套列表<>的最快方法

5 c# nested list

我有一个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)

编辑: 一些更正:我只需要看看内部列表是否有一个具有特定值的项目.如果是,那么我需要返回具有匹配项的顶级项目.我猜逻辑是一样的.

Jus*_*eld 7

这将是我如何使用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重构使用键控字典会更快.


Cod*_*aos 4

如果您想保留数据结构,那么我看到的唯一改进就是放弃基于委托的搜索和手动搜索。我预计这会带来约二倍的改善。

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,但我不知道这是否是其中之一。所以你需要进行基准测试。