从具有相同列表的子项的列表中查找最大ID

我有一个有子女[同类型]的人员名单。 我从XML文件中获取列表。

场景:

人:身份证,姓名,性别,年龄,儿童[与领域类]

如果personList具有1,2,5个ID,
2和5分别与儿童3,4和6,7,8。
我必须将最大id设为8。

如何使用lambda表达式从PersonList中获取Id的最大值?


你可以尝试ConcatSelectMany的组合(假设它只能嵌套一层):

var maxId = personList.Concat(personList.SelectMany(p => p.Children)).Max(p => p.Id);

UPDATE
如果你有多个嵌套层次,你也可以编写一个扩展方法来使SelectMany递归:

public static IEnumerable<T> SelectManyRecursive<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector) {
    if (source == null) { yield break; }
    foreach (var item in source) {
        yield return item;
        foreach (var selected in selector(item).SelectManyRecursive(selector)) {
            yield return selected;
        }
    }
}

这不会处理循环引用,它的行为与SelectMany的行为不同,它还会返回源集合本身中的项目(因此您可能需要更改名称),但除此之外,我认为它可以完成这项工作。 你可以很容易地使用它:

var maxId = personList.SelectManyRecursive(p => p.Children).Max(p => p.Id);

看看这里..

http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/84c720e0-a734-4320-9cf7-b9a198a25184/


我通过增加另一个级别来轻松切换你的场景。 如果这没有帮助,请发布一个数据对象的例子。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace App
{
    public enum ID{
        one, two, three, four, five, six, seven, eigth, nine, ten
    }

    public class Person
    {
        public ID id;
        public List<Person> children;
        public Person(ID id, List<Person> children)
        {
            this.id = id;
            this.children = children;
        }
    }

    class Program
    {
        private static List<Person> BuildScenario()
        {
            return new List<Person>{
                new Person(ID.one, new List<Person>()),
                new Person(ID.two, new List<Person>{
                    new Person(ID.three, new List<Person>{
                        new Person(ID.ten, new List<Person>())
                    }),
                    new Person(ID.four, new List<Person>())
                }),
                new Person(ID.five, new List<Person>{
                    new Person(ID.six, new List<Person>()),
                    new Person(ID.seven, new List<Person>()),
                    new Person(ID.eigth, new List<Person>())
                })
            };
        }

        static void Main(string[] args)
        {
            List<Person> scenario = BuildScenario();
            Console.WriteLine(CountIDs(scenario).ToString());
            Console.WriteLine(GetMaxID(scenario).ToString());
            while(true);
        }

        private static int CountIDs(List<Person> scenario)
        {
            int count = 0;
            foreach (Person person in scenario)
            {
                count += 1 + CountIDs(person.children);
            }
            return count;
        }


        private static ID GetMaxID(List<Person> scenario)
        {
            ID maxid = 0;
            foreach(Person person in scenario)
            {
                ID childmax = GetMaxID(person.children);
                if (person.id > maxid) maxid = person.id;
                if (childmax > maxid) maxid = childmax;

            }
            return maxid;
        }
    }
}
链接地址: http://www.djcxy.com/p/51373.html

上一篇: Find Max Id from list which has children of same list

下一篇: Abstracting from Stateful object navigation (1