2012-06-12 67 views
1

我有一個擁有子項[同類型]的人員列表。我從XML文件中獲取列表。從列表中找到具有相同列表的子項的最大ID

場景:

人:ID,姓名,性別,年齡,兒童[類具有字段]

如果personList有1,2,5 IDS,
2和5的兒童3 ,4和6,7,8。
我必須得到最大id爲8.

我如何從使用lambda表達式的PersonList獲取Id的最大值?

+0

有多少級別的孩子可以參加? – Rawling

+0

可能有2個級別。但在某些情況下,我可以有更多的水平(高達10)。我的scenerio與上面提到的scenerio有點不同。 –

回答

5

你可以嘗試的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); 
+0

鑑於他現在想要達到3個關卡,你會添加另一層'Concat' /'SelectMany'還是推薦一些遞歸的? – Rawling

+0

@Rawling我更新了我的答案,其中包括一個遞歸方法的簡短示例。 – Botz3000

+0

太好了......我打算給你+1,但看起來我已經_did_: -/ – Rawling

0

我切換sligthly您的方案通過增加另一個層次。 如果這沒有幫助,請發佈您的數據對象的例子。

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; 
     } 
    } 
} 
相關問題