이것에 대해 .. 여기
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에 대한 호출이 단 하나의 인수 만 전달합니다! –
첫 번째 컴파일 : P –
첫 번째 변경 : TreeNode foundNode = findNode (subNode, value); – ss2k