私はリストを持っています
key ParentKey
1 Null
2 1
3 Null
4 Null
5 1
6 4
7 6
8 3
並べてほしい
key ParentKey
1 Null
2 1
5 1
3 Null
8 3
4 Null
6 4
7 6
linq経由でこれを行うにはどうすればよいですか? どんな助けでも大歓迎です
結果が次のようになると仮定します。
key ParentKey
1 Null
2 1
5 1
3 Null
8 3
4 Null
6 4
7 6
その位置の null 値をリストに入れるロジックがなければ、何もできないと言えます。
したがって、Linq を使用すると、OrderBy()関数を使用してリストを並べ替えることができます。
list = list.OrderBy(x => x.ParentKey).ToList();
しかし、この関数を使用すると、結果は次のようになります。
key ParentKey
1 Null
3 Null
4 Null
2 1
5 1
8 3
6 4
7 6
あなたがのリストを持っている場合
public class MyObject{
int Key {get;set;}
int ? ParentKey{get;set;}
}
このリストをソートするには、次を使用します。
var list = new List<MyObject>(){ new MyObject{ Key = 1 , ParentKey = null } , new MyObject{Key=2 , PatentKey = 1} /* and so on */};
var sortedList = list.OrderBy(o=>o.ParentKey , new MyComparer());
public class MyComparer : IComparer<MyObject>
{
public int Compare(MyObject o1, MyObject o2)
{
if (ol.HasValue && o2.HasValue)
{
if (ol.ParentKey.Value == o2.ParentKey.Value)
return 0;
return ol.ParentKey.Value > o2.ParentKey.Value ? 1 : -1;
}
else
return 0;
}
}
これにより、期待されるシーケンスが正確に生成されます
ここで達成したいのは、DFSで注文されたツリーのプリントだと思います。
Linq はそれを手助けすることはできません (少なくともそのままでは)。
DFS の実装をデータ構造に適合させることをお勧めします。Eric Lippert の提案を参照してください。