我有一個擁有子項[同類型]的人員列表。我從XML文件中獲取列表。從列表中找到具有相同列表的子項的最大ID
場景:
人:ID,姓名,性別,年齡,兒童[類具有字段]
如果personList有1,2,5 IDS,
2和5的兒童3 ,4和6,7,8。
我必須得到最大id爲8.
我如何從使用lambda表達式的PersonList獲取Id的最大值?
我有一個擁有子項[同類型]的人員列表。我從XML文件中獲取列表。從列表中找到具有相同列表的子項的最大ID
場景:
人:ID,姓名,性別,年齡,兒童[類具有字段]
如果personList有1,2,5 IDS,
2和5的兒童3 ,4和6,7,8。
我必須得到最大id爲8.
我如何從使用lambda表達式的PersonList獲取Id的最大值?
你可以嘗試的Concat
和SelectMany
組合(這是假設這只是一個嵌套級):
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);
我切換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;
}
}
}
有多少級別的孩子可以參加? – Rawling
可能有2個級別。但在某些情況下,我可以有更多的水平(高達10)。我的scenerio與上面提到的scenerio有點不同。 –