繁体   English   中英

在列表中查找项目

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM