在C#
中,如果我有多个List<T>
列表,其中列表中的每个项都继承自具有id
属性的接口,那么检索对象的最佳方法是什么?具有特定的id
?
所有ids
都是唯一的,所有列表都存储在一个对象中。
我目前正在考虑为每个列表编写Find
段代码,如果返回的对象不为null,则返回的对象是具有id的对象。
有更好的方法吗?
要告知,这个问题是关于如何在多个列表中查找对象,而不是在单个列表中查找对象的代码。
答案 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;
}
}
是由IId
和A
实施的通用界面。现在你可以这样做:
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