代码之家  ›  专栏  ›  技术社区  ›  David Pfeffer

在C中实现多个IEnumerable#

  •  3
  • David Pfeffer  · 技术社区  · 14 年前

    我有一个普通班, Class<T> ,实现 IEnumerable<T> . T 也被限制实施 IConvertable .

    我还希望这个类能够假装成字符串一样的对象,所以我想实现 IEnumerable<char> . 然而, IEnumerable<T> 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);
    }
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   LukeH    14 年前

    你说你需要你的类“假装成一个字符串一样的对象”。你能使类似字符串的行为更加明确,避免实现 IEnumerable<char> 完全?

    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);
    }
    
        2
  •  10
  •   Eric Lippert    14 年前

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

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

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

        3
  •  1
  •   Bonshington    14 年前
    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];
    }