我有一个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?
修改 一些更正:我只需要看看内部列表是否有一个具有特定值的项目。 如果是,那么我需要返回具有匹配项的顶级项目。 我猜逻辑是一样的。
答案 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将为您提供更优化的检查。