以下这段程序提示说错误 1 使用泛型 类型“System.Collections.Generic.IEnumerable<T>”需要“1”个类型
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication12
{
public class Tokens : IEnumerable
{
private string elements;
Tokens(string source, char deliniters)
{
elements = source.Split(deliniters);
}
public IEnumerator GetEnumerator()
{
return new TokenEnumerator(this);
}
private class TokenEnumerator : IEnumerator
{
private int position = -1;
private Tokens t;
public TokenEnumerator(Tokens t)
{
this.t = t;
}
public bool MoveNext()
{
if (position < t.elements.Length - 1)
{
position++;
return true;
}
else
{
return false;
}
}
public void Reset()
{
position = -1;
}
public object Current
{
get
{
return t.elements;
}
}
}
}
class Program
{
static void Main(string[] args)
{
Tokens f = new Tokens("This is well-done program.", new char { ' ', '-' });
foreach (string item in f)
{
Console.WriteLine(item);
}
}
}
}
求大神指点如何修改? 展开
在给你贴完整的修正代码之前我要指出几个严重的问题.
明显可以看出你要的是Tokens类维护一个string集合(依你的需求string[]足矣),也就是elements,那么在指示Tokens继承集合接口IEnumrable时应使用IEnumrable<string>做标记.
IEnumrable<string>接口要求实现public IEnumerator<string> GetEnumerator()和System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()两个方法,出于资源复用和节省开销等因素,该枚举器应来源于Tokens类中的私有成员,而不是像你的代码一样每次新建一个枚举器;同理,新建枚举器是无法保存当前位置(position)的,除非再次浪费资源传进去.通用的做法是在Tokens中声明private TokenEnumrator elementEnumrator,并且在Tokens构造时就将该elementEnumrator初始化.
其他的小问题.string应该是string[]或者List<string>; 还有new char { ' ', '-' }太让人费解了,将Tokens的构造写成Tokens(string source,param char[] deleniters)更符合你的需求....etc...
最后也是最重要的一点,泛型让一切集合操作变得如此简单,既然框架已经提供了各种现有的强大的类,能用就尽量用吧.说实在的,自己重写枚举器我1年都不会写超过一次,你的例子很简单,一个List<T>搞定.如果需要干涉其枚举器,就通过GetEnumrator<T>方法取出来自己操作,更复杂的情况下,请override相关方法,免得自己实现每一个接口方法费时费力.
你要的代码见下,已调试.这是改动最小的情况下,不是最优代码:
public class Tokens : IEnumerable<string>
{
private string[] elements;
private TokenEnumrator enumrator;
public Tokens(string source, params char[] deleniters)
{
elements = source.Split(deleniters);
enumrator = new TokenEnumrator(elements);
}
public IEnumerator<string> GetEnumerator()
{
return enumrator;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return enumrator;
}
class TokenEnumrator : IEnumerator<string>
{
string[] elements;
int position = -1;
public TokenEnumrator(string[] elements)
{
this.elements = elements;
}
public string Current
{
get { return position == -1 ? null : elements[position]; }
}
public void Dispose()
{
}
object System.Collections.IEnumerator.Current
{
get { return position == -1 ? null : elements[position]; }
}
public bool MoveNext()
{
if (position < elements.Length - 1)
{
position++;
return true;
}
else
return false;
}
public void Reset()
{
position = -1;
}
}
}
class Program
{
static void Main(string[] args)
{
Tokens f = new Tokens("This is well-done program.", ' ', '-');
foreach (string item in f)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
QQ176229432 欢迎骚扰
我去,大神。。谢谢啦。。
...我正在修改回答来着...
楼上说的加一个System.Collentions空间引用的方法是通用且可行的,但是我个人强烈建议使用泛型标示至少IEnumrable,方便代码规整,而且在使用其枚举器IEnumrator时可以明确的知道其维护的元素的类型.
最典型的例子: f.GetEnumerator().Current不使用泛型IEnumrable时只会返回object,有时候代码多脑子乱还要去看Tokens是怎么写的...还不如用IEnumrable,直接得到T类型的值.
个人建议而已...请随便看看
public class Tokens<String> : IEnumerable<T>
第二个类估计也得改成这样,还有,你第一个类中的字段应该是String[]类型吧
额。。能给个修改完成的么?。。
你把鼠标放在出错代码上---鼠标右键----解析。 就行了。
额。。这个应该有吧。。你看我的第二行。。。