在列表中找到一个项目
本文关键字:一个 项目 列表 | 更新日期: 2023-09-27 18:09:28
在c#中,如果我有一个对象列表,其中每个列表都有一个列表项的列表,并且每个列表项可以是一个对象列表(或者只是一个列表项),那么按名称检索特定列表的最佳方法是什么?
每个列表和列表项都有一个唯一的名称。MapLocationListItem
中的type属性为"List"或" listtitem "。
下面是类:
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;}
}
Thanks in advance
这里有一个树(有两种类型的节点)(同样假设没有循环,这将使它成为一个图)。遍历树是一个相当简单的问题,在一般情况下,我们只需要几行代码就可以解决:
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>
,我们所需要的就是创建一个函数来获取任何给定节点的所有子项目来使用我们的Traverse
方法。如果我们只有一种类型的节点,我们就会直接得到所有的子节点。由于我们有两种类型,我们需要使用SelectMany
来获取子节点的子节点:
var allNodes = rootNodes.Traverse(mapLocations =>
mapLocations.listItems.SelectMany(item => item.list));
从这里我们可以很容易地获得具有给定名称的第一个项目:
var servyNode = allNodes.FirstOrDefault(node => node.name == "Servy");
找到如下解决方案,这将找到并返回maplocationlisttitem否则为空(如果未找到)
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();