在C#中实现多个IEnumebles

时间:2010-11-16 16:48:21

标签: c# ienumerable

我有一个实现Class<T>的泛型类IEnumerable<T>T也被限制为实施IConvertable

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

有没有人对如何做到这一点有任何建议?

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

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 个答案:

答案 0 :(得分:10)

  

有没有人对如何做到这一点有任何建议?

泛型类型的声明,使得基础类型可以在建设中统一有时是非法的,并且几乎总是一个坏主意。避免,避免,避免。

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

答案 1 :(得分:2)

你说你需要你的班级“假装是一个类似字符串的对象”。你能否使类似字符串的行为更明确,并且完全避免实现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 :(得分:1)

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);
 }
}

或只是把if

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];
}