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

时间:2011-07-09 07:48:22

标签: c# list nested

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

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

4 个答案:

答案 0 :(得分:7)

这将是我使用Linq实现这一目标的方法。

var answer = from topList in TopListItems
             from innerListItem in topList.InnerList
             where innerListItem.GuestId == guestId
             select topList;

或根据Claytons评论使用Lambdas

var answer = TopListItems.FirstOrDefault(topList => 
             topList.InnerList.Any(innerList => 
             innerList.GuestId == guestId));

然而,使用GuestId重构使用键控字典会更快。

答案 1 :(得分:4)

如果你想保留数据结构,那么我看到的唯一改进就是抛弃基于代理的搜索并手动搜索。我预计这个因素会有所改善。

foreach(var innerList in outerList)
{
    foreach(var item in innerList)
    {
        if(item.GuestId == guestId)
            return innerList;
    }
}
return null;

如果可能,您可以通过某种方式使用词典。但是我不太了解你的问题,告诉你这是否可能。这可以提供非常大的加速,因为字典中的键搜索是O(1)而不仅仅是O(n)。

在某些情况下,for循环可能会在foreach循环上略微加速,但我不知道这是否是其中之一。所以你需要进行基准测试。

答案 2 :(得分:1)

你可以递归地做。这段代码可能不适合你,但它会是这样的:

public object loopList(List<object> dList,object searchvalue)
{
    foreach(object value in dList)
    {
      if(searchvalue == value)
      {
        return value;
      }
      else
      {
         loopList((List<object>)value);
       }
    }
}

答案 3 :(得分:0)

内部列表是否排序?如果是这样,您可以使用二进制搜索内部列表,这将提供潜在的性能改进。此外,如果您可以控制内部列表的构造,将其更改为在GuestId上键入的Dictionary将为您提供更优化的检查。