在列表中查找项目

时间:2014-06-19 14:29:50

标签: c# list object search recursion

在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;}
}

提前致谢

3 个答案:

答案 0 :(得分:1)

这里有一棵树(有两种类型的节点)(假设你没有周期,这会使它成为图形)。遍历树是一个相当简单的问题,我们实际上可以通过一些代码行来解决这个问题:

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");

答案 1 :(得分:-1)

找到如下解决方案,这将找到并返回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; }
    }

答案 2 :(得分:-1)

你可以使用Linq:

   var res = from item in listItems
             where item.Name equals "yourentry"
             select item;

或简单地说:

MapLocationListItem findRes = listItems.Where(x => x.name.Equals(yourentry)).FirstOrDefault();