[英]Find an item in a list
在C#中,如果我有一个对象列表,其中每个列表都有一个列表项列表,并且每个这些列表项都可以是一个对象列表(或仅仅是一个列表项),那么检索特定对象的最佳方法是什么按名称列出?
每个列表和列表项都有一个唯一的名称。 MapLocationListItem
的type属性是“ List”或“ ListItem”。
这些是类:
public class MapLocationList
{
public string name { get; set; }
public List<MapLocationListItem> listItems { get; set;}
public MapLocationList ()
{
listItems = new List<MapLocationListItem> ();
}
}
public class MapLocationListItem
{
public string name { get; set;}
public string type { get; set;}
public string heading { get; set;}
public string subheading { get; set;}
MapLocationList mapLocationList{ get; set;}
}
提前致谢
您这里拥有的是一棵树(具有两种类型的节点)(还假设您没有循环,这将使它成为图)。 遍历一棵树是一个相当简单的问题,在通常情况下,我们只需使用几行代码即可解决:
public static IEnumerable<T> Traverse<T>(
this IEnumerable<T> source
, Func<T, IEnumerable<T>> childrenSelector)
{
var stack = new Stack<T>(source);
while (stack.Any())
{
var next = stack.Pop();
yield return next;
foreach (var child in childrenSelector(next))
stack.Push(child);
}
}
因此,现在有了List<MapLocationList>
我们所需List<MapLocationList>
就是创建一个函数来获取任何给定节点的所有子项,以使用我们的Traverse
方法。 如果我们只有一种类型的节点,我们将直接获得所有子节点。 由于我们有两种类型,因此我们需要使用SelectMany
来获取子节点的子节点:
var allNodes = rootNodes.Traverse(mapLocations =>
mapLocations.listItems.SelectMany(item => item.list));
从这里我们可以轻松获得具有给定名称的第一项:
var servyNode = allNodes.FirstOrDefault(node => node.name == "Servy");
找到如下所示的解决方案,它将找到并返回MapLocationListItem,否则返回null(如果未找到)
public class MapLocationList
{
public string name { get; set; }
public List<MapLocationListItem> listItems { get; set; }
public MapLocationList()
{
listItems = new List<MapLocationListItem>();
}
public MapLocationListItem findByName(string locationName)
{
MapLocationListItem findRes = listItems.Where(x => x.name.Equals(locationName)).FirstOrDefault();
return findRes;
}
}
public class MapLocationListItem
{
public string name { get; set; }
public string type { get; set; }
public string heading { get; set; }
public string subheading { get; set; }
MapLocationList list { get; set; }
}
您可以使用Linq:
var res = from item in listItems
where item.Name equals "yourentry"
select item;
或者简单地:
MapLocationListItem findRes = listItems.Where(x => x.name.Equals(yourentry)).FirstOrDefault();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.