从具有特定ID的多个List <t>列表中获取对象

时间:2015-07-23 11:39:03

标签: c# list generics

C#中,如果我有多个List<T>列表,其中列表中的每个项都继承自具有id属性的接口,那么检索对象的最佳方法是什么?具有特定的id

所有ids都是唯一的,所有列表都存储在一个对象中。

我目前正在考虑为每个列表编写Find段代码,如果返回的对象不为null,则返回的对象是具有id的对象。

有更好的方法吗?

要告知,这个问题是关于如何在多个列表中查找对象,而不是在单个列表中查找对象的代码。

4 个答案:

答案 0 :(得分:3)

如何使用Linq:

var result = list.First(x => x.id == findThisId);

答案 1 :(得分:1)

var result =
 new [] { list1, list2, list3, ... }
 .Select(list => list.FirstOrDefault(x => x.id == findThisId))
 .First(x => x != null);

您还可以将多个列表视为一个连续列表:

var result =
 new [] { list1, list2, list3, ... }
 .SelectMany(x => x) //flatten
 .FirstOrDefault(x => x.id == findThisId);

答案 2 :(得分:0)

var result = list.Where(i => i.Id == id).FirstOrDefault();

答案 3 :(得分:0)

您可以创建列表列表,并使用LINQ的private Item _parentItem; public Item ParentItem { get { if (_parentItem == null) { if (Sitecore.Context.Item.Fields["Navigation Parent"] != null && Sitecore.Context.Item.Fields["Navigation Parent"].Value == "1") { _parentItem = Sitecore.Context.Item; } else if (Sitecore.Context.Item.Parent.Fields["Navigation Parent"] != null && Sitecore.Context.Item.Parent.Fields["Navigation Parent"].Value == "1") { _parentItem = Sitecore.Context.Item.Parent; } else { // Assuming you don't want an ancestor's child to be displayed _parentItem = null; } } return _parentItem; } }

进行搜索

以下是一个示例设置:

SelectMany

interface IId { int Id {get;} } class A : IId { public int Id {get;set;} public override string ToString() { return "A"+Id; } } class B : IId { public int Id {get;set;} public override string ToString() { return "B"+Id; } } 是由IIdA实施的通用界面。现在你可以这样做:

B

var a = new List<A> {new A {Id=5}, new A {Id=6}}; var b = new List<B> {new B {Id=7}, new B {Id=8}}; var all = new List<IEnumerable<IId>> {a, b}; 是一个列表,其中包含all的不同子类型的列表。由于泛型的协方差规则,它需要被声明为IId的列表。

现在,您可以按IEnumerable搜索all,如下所示:

Id

Demo.