4

次の基本構造を持つオブジェクトのリストがあります。

class Person
{
    public int ID {get; set;}
    public bool ShowChildren {get; set;}
    public int ParentID {get; set;}

    // ...many other properties...
}

ID 順に並んだ Person 親クラスのリストを返す必要があります。ShowChildren フラグが有効になっている場合は、親の下にある子も ID 順に並べて返します。

これは 1 レベルのみの深さです。つまり、子には子がありません。

すべての親を提供する linq ステートメントを作成できますが、親のフラグが有効になっているときに、並べ替えられた子も含める方法に行き詰まっています。

var People = PersonList
             .Where(x => x.ParentID == 0)
             .Orderby(x => x.ID)
             .ToList();
4

2 に答える 2

4

申し訳ありませんが、明示的に要求されない限り親のみを返したい場合 (ありがとう、@Rawling!)、foreachループも便利です。

var people = new List<Person>();

PersonList.Sort((a, b) => a.ID - b.ID);

foreach(Person p in PersonList) {
    if(p.ParentID == 0) { // Or whatever value you use to represent it
        people.Add(p);

        if(p.ShowChildren) {
            people.AddRange(PersonList.Where(c => c.ParentID == p.ID));
        }
    }
}
于 2012-07-05T17:54:19.883 に答える
1

これは、次の2 つのステートメントで行うことができます。

// Build a lookup: parent ID => whether to show children.
var showChildrenDictionary = PersonList
    .Where(p => p.ParentID = 0)
    .ToDictionary(p => p.ID, p => p.ShowChildren);

// Get the desired list
var orderdedWithAppropriateChildren = PersonList
    // Discard children where not shown
    .Where(p => p.ParentID == 0 || showChildrenDictionary[p.ParentID])
    // Sort so parents and children are together and ordered by the parent
    .OrderBy(p => ((p.ParentID == 0) ? p.ID : p.ParentID))
    // Sort so parent is at start of group
    .ThenBy(p => p.ParentID != 0)
    // Sort so children are in order
    .ThenBy(p => p.ID)
    .ToList();
于 2012-07-05T18:12:02.560 に答える