![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
public static class CollectionExtensions
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public static ICollection<T> BuildTree<T, TKey>(
this ICollection<T> collection,
Func<T, TKey> getKey,
Func<T, TKey> getParentKey,
Func<T, ICollection<T>> getChildren,
TKey topestParentKey)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
for (int i = 0; i < collection.Count; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
T element = collection.ElementAt(i);
TKey elementKey = getKey(element);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
foreach (var member in collection)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (object.Equals(getParentKey(member), elementKey))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
getChildren(element).Add(member);
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int i = 0; i < collection.Count; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
T element = collection.ElementAt(i);
TKey elementKey = getKey(element);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
if (!object.Equals(getParentKey(element), topestParentKey))
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
collection.Remove(element);
--i;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return collection;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Sample
static class Program
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
static void Main(string[] args)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
List<Node> nodes = BuildNodes();
Console.WriteLine("Total: {0}", nodes.Count);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
var result = nodes.BuildTree(
node => node.ID,
node => node.Parent == null ? null : node.Parent.ID,
node => node.Children,
null)
.OrderBy(node => node.ID);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
int total = 0;
Write(result, ref total);
Console.WriteLine("Total: {0}", total);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Console.Write("Press any key to exit
");
Console.ReadKey(true);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
static void Write(IEnumerable<Node> nodes, ref int total)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
foreach (var node in nodes)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Console.WriteLine(node.ID);
++total;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
Write(node.Children, ref total);
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
static List<Node> BuildNodes()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Random random = new Random();
List<Node> allNodes = new List<Node>();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int i = 1; i <= 3; i++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Node first = new Node()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ID = string.Format("First {0}", i),
Order = random.Next(1, 1000)
};
allNodes.Add(first);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int j = 1; j <= 3; j++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Node second = new Node()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ID = string.Format("Second {0} {1}", i, j),
Order = random.Next(1, 1000),
Parent = first
};
allNodes.Add(second);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
for (int k = 1; k <= 3; k++)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Node third = new Node()
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
ID = string.Format("Third {0} {1} {2}", i, j, k),
Order = random.Next(1, 1000),
Parent = second
};
allNodes.Add(third);
}
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return allNodes.OrderBy(node => node.Order).ToList();
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
class Node
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public string ID;
public Node Parent;
public int Order;
public readonly List<Node> Children = new List<Node>();
}
posted @
2009-08-19 00:52
周巍
阅读(
206)
评论()
编辑
收藏
举报