C# 在C中实现多个IEnumerable

C# 在C中实现多个IEnumerable,c#,ienumerable,C#,Ienumerable,我有一个实现IEnumerable的泛型类class。T也被限制为实现IConvertable 我还希望这个类能够假装成一个类似字符串的对象,所以我想实现IEnumerable。然而,IEnumerable和IEnumerable发生冲突-如果T是char会发生什么 有人对如何做到这一点有什么建议吗 编辑:这里有一些澄清-我希望能够做到以下几点: public IEnumerator<T> GetEnumerator() { for (var i = _offset; i &

我有一个实现IEnumerable的泛型类class。T也被限制为实现IConvertable

我还希望这个类能够假装成一个类似字符串的对象,所以我想实现IEnumerable。然而,IEnumerable和IEnumerable发生冲突-如果T是char会发生什么

有人对如何做到这一点有什么建议吗

编辑:这里有一些澄清-我希望能够做到以下几点:

public IEnumerator<T> GetEnumerator()
{
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i];
}

public IEnumerator<char> GetEnumerator()
{
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i].ToChar(null);
}
有人对如何做到这一点有什么建议吗

声明泛型类型以使基类型可以在构造中统一有时是非法的,而且几乎总是一个坏主意。避免,避免,避免

我的建议是:如果你想要一个像字符串一样的对象,那么要么重写ToString,要么声明一个显式转换,或者,我想,隐式转换为string。如果用户想要一个字符序列,那么他们可以从字符串中获得一个

public class myClass<T>() : IEnuerable<T> where T: IConvertable
{
 public override string ToString()
 {
  if(typeof(T).Equals(typeof(char)))
   return this.Select(obj => obj.ToChar(null).ToString()).Aggregate((cur, nex) => cur + "," + nex);;
  else
   return this.Select(obj => obj.ToString()).Aggregate((cur, nex) => cur + "," + nex);
 }
}
或者你可以使用扩展方法

public static class extension
{
 public static string To_String<T>(this IEnumerable<T> data) where T:IConvertable
 {
  if(typeof(T).Equals(typeof(char)))
   return data.Select(obj => obj.ToChar(null).ToString()).Aggregate((cur, nex) => cur + "," + nex);;
  else
   return data.Select(obj => obj.ToString()).Aggregate((cur, nex) => cur + "," + nex);
 }
}
或者干脆把

public IEnumerator<T> GetEnumerator()
{
  if(typeof(T).Equals(typeof(char)))
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i].ToChar(null);
  else
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i];
}

你说你需要你的类假装成一个类似字符串的对象。您能否使类似字符串的行为更加明确,并避免实现IEnumerable


您是否尝试只实现IEnumerable并检查实现中的T是否为char?这行吗?这门课的其他用法是什么?要使其通用?正如我所见,您有GetEnumerator方法,它与act和char不同,不需要创建这样的类。例如,您可以有一个实现上述所有内容的列表,我要说的是,您的类要实现什么来创建它,如果有理由创建您的类,你为什么决定创建通用对象?@Saeed:我不明白你在说什么。我试图避免新对象生成生成字符串。我只需要有类似字符串的行为。隐式运算符呢?隐式或显式,仍然有一个新对象。@David:所以你使用IEnumerable来避免创建新对象?当枚举字符或T序列时,您打算如何避免为IEnumerator创建对象?@Brian:我想David的意思是,他的池策略是,当枚举器对象被释放时,它可以被重置并填充回池中。如果您处于一个对GC压力高度敏感的环境中,这是一种有点可怕但相当常见的避免内存分配的技术。听起来他是。哇,等一下。。。您可以使用yield返回IEnumerable和IEnumerator?
public IEnumerator<T> GetEnumerator()
{
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i];
}

// either
public IEnumerator<char> GetCharEnumerator()
{
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i].ToChar(null);
}

// or
public IEnumerable<char> AsCharSequence()
{
    for (var i = _offset; i < _offset + _length; i++)
        yield return _array[i].ToChar(null);
}