public IEnumerable<TValue> Find(IEnumerable<T> text)
{
var node = root;
foreach (T c in text)
{
while (node[c] == null && node != root)
node = node.Fail;
node = node[c] ?? root;
for (var t = node; t != root; t = t.Fail)
{
foreach (TValue value in t.Values)
yield return value;
}
}
}
private class Node<TNode, TNodeValue> : IEnumerable<Node<TNode, TNodeValue>>
{
private readonly TNode word;
private readonly Node<TNode, TNodeValue> parent;
private readonly Dictionary<TNode, Node<TNode, TNodeValue>> children = new Dictionary<TNode, Node<TNode, TNodeValue>>();
private readonly List<TNodeValue> values = new List<TNodeValue>();
///根节点的构造函数。
public Node()
{
}
public Node(TNode word, Node<TNode, TNodeValue> parent)
{
this.word = word;
this.parent = parent;
}
public TNode Word
{
get { return word; }
}
public Node<TNode, TNodeValue> Parent
{
get { return parent; }
}
///失败或跌倒节点。
public Node<TNode, TNodeValue> Fail
{
get;
set;
}
public Node<TNode, TNodeValue> this[TNode c]
{
get { return children.ContainsKey(c) ? children[c] : null; }
set { children[c] = value; }
}
public List<TNodeValue> Values
{
get { return values; }
}
/// <inherit/>
public IEnumerator<Node<TNode, TNodeValue>> GetEnumerator()
{
return children.Values.GetEnumerator();
}
/// <inherit/>
IEnumerator IEnumerable.GetEnumerator() //error thrown here - requires 1 type argument
{
return GetEnumerator();
}
public override string ToString()
{
return Word.ToString();
}
}
}
任何人都可以帮助解决问题。 C#相当新,不能理解我错过的东西。在其他论坛上,人们建议从Collections命名空间中删除Generic这个词,但这也不起作用
答案 0 :(得分:1)
您的通用类型标识符TValue
和T
在该范围内不存在。而不是
public IEnumerable<TValue> Find(IEnumerable<T> text)
尝试
public IEnumerable<T> Find<T>(IEnumerable<T> text)
您无法选择通用类型标识符,它们需要存在于您可以使用的范围内。 TNode和TNodeValue都会受到同样的影响,因为它们没有在相同的范围内定义。顺便说一下,你应该发布所有代码并正确格式化,因为我很难理解我是否看到你的整个此处的代码(TNode
和TNodeValue
是否已定义?TValue
和T
是否已定义?root
来自何处?)