次のようなツリー構造を構築したい:
root Id 1
child id 2
grandChild id 3
以下のコードサンプル。使用するGetChildrenNodesCorrect(),
と、正しい結果が得られます。しかし、GetChildrenNodesWrong()
を使用すると、次のように返されます。
root Id 1
child id 2
Null
私はそれToList()
が遅延実行ではないことを知っており、すぐに結果を返します。誰でもこれを説明できますか?
public class ToListTest
{
public static void Entry()
{
var toListTest = new ToListTest();
toListTest.Test();
}
public void Test()
{
List<Node> newsList = new List<Node>
{
new Node{Id = 1, ParentId = 0},
new Node{Id = 2, ParentId = 1},
new Node{Id = 3, ParentId = 2}
};
var root = BuildUpTree(newsList);
}
private TreeNode BuildUpTree(List<Node> newsList)
{
var root = new TreeNode { currentNode = newsList.First(n => n.ParentId == 0) };
BuildUpTreeChildrenNodes(newsList, root);
return root;
}
private void BuildUpTreeChildrenNodes(List<Node> newsList, TreeNode currentTreeNode)
{
currentTreeNode.Children = GetChildrenNodesWrong(newsList, currentTreeNode);
foreach (var node in currentTreeNode.Children)
{
BuildUpTreeChildrenNodes(newsList, node);
}
}
private IEnumerable<TreeNode> GetChildrenNodesWrong(List<Node> newsList, TreeNode cuurentNode)
{
return newsList.Where(n => n.ParentId == cuurentNode.currentNode.Id)
.Select(n => new TreeNode
{
currentNode = n
});
}
private IEnumerable<TreeNode> GetChildrenNodesCorrect(List<Node> newsList, TreeNode cuurentNode)
{
return GetChildrenNodesWrong(newsList, cuurentNode).ToList();
}
public class TreeNode
{
public Node currentNode { get; set; }
public IEnumerable<TreeNode> Children { get; set; }
}
public class Node
{
public int Id { get; set; }
public int ParentId { get; set; }
}
}
アップデート
デバッグでは、GetChildrenNodesWrong(),
ルートを使用すると、メソッドが戻る前に子と孫の両方があります。メソッドが戻った後、ルートには子のみがあり、孫は null です。
更新 2
IMO、問題はきれいなコードに関連していない可能性があります。しかし、より直感的なコードを示すことは誰でも大歓迎です。