這個怎麼樣..
public class Node<T> where T:IComparable
{
public T Value { get; set; }
public IList<Node<T>> Children { get; set; }
public override string ToString()
{
return Value.ToString();
}
public static Func<T, Node<T>, Node<T>> GetFindFirstFunc()
{
Func<T, Node<T>,Node<T>> func = null;
func = (value,currentNode) =>
{
if (currentNode.Value.CompareTo(value) == 0)
{
return currentNode;
}
if (currentNode.Children != null)
{
foreach (var child in currentNode.Children)
{
var result = func(value, child);
if (result != null)
{
//found the first match, pass that out as the return value as the call stack unwinds
return result;
}
}
}
return null;
};
return func;
}
public static Func<T, Node<T>, IEnumerable<Node<T>>> GetFindAllFunc()
{
Func<T, Node<T>, IEnumerable<Node<T>>> func = null;
List<Node<T>> matches = new List<Node<T>>();
func = (value, currentNode) =>
{
//capture the matches List<Node<T>> in a closure so that we don't re-create it recursively every time.
if (currentNode.Value.CompareTo(value) == 0)
{
matches.Add(currentNode);
}
if (currentNode.Children != null)
{
//process all nodes
foreach (var child in currentNode.Children)
{
func(value, child);
}
}
return matches;
};
return func;
}
}
下面是調用代碼:
static void Main(string[] args)
{
Node<int> rootNode = new Node<int>
{
Value = 1,
Children = new List<Node<int>>
{
new Node<int>
{ Value = 2,
Children = new List<Node<int>>
{
new Node<int>{ Value = 7},
new Node<int>{ Value = 4}
}
},
new Node<int>
{ Value = 5,
Children = new List<Node<int>>
{
new Node<int>{ Value = 6},
new Node<int>{ Value = 7}
}
}
}
};
Func<int, Node<int>, Node<int>> findFirst = Node<int>.GetFindFirstFunc();
var firstValue = findFirst(7, rootNode);
Func<int, Node<int>, IEnumerable<Node<int>>> findAll = Node<int>.GetFindAllFunc();
var allvalues = findAll(7, rootNode);
}
你編譯這個? 「委託'Func'不帶'1'參數」。 您對findNodes的調用僅傳入1個參數! – 2009-07-24 06:34:21
我編譯了第一個:P – 2009-07-24 06:40:14