31

C#.NET 3.5 でカスタム ConfigurationHandler のカスタム ConfigurationElementCollection を作成しており、IEnumerator を汎用 IEnumerator として公開したいと考えています。

これを達成するための最良の方法は何ですか?

私は現在コードを使用しています:

public new IEnumerator<GenericObject> GetEnumerator()
{
  var list = new List();
  var baseEnum = base.GetEnumerator();
  while(baseEnum.MoveNext())
  {
    var obj = baseEnum.Current as GenericObject;
    もし (obj != null)
      list.Add(obj);
  }
  list.GetEnumerator(); を返します。
}

乾杯

4

5 に答える 5

56

フレームワークには何もないと思いますが、簡単に書くことができます。

IEnumerator<T> Cast<T>(IEnumerator iterator)
{
    while (iterator.MoveNext())
    {
        yield return (T) iterator.Current;
    }
}

Enumerable.Cast<T>LINQから呼び出してから結果を呼び出すのは魅力的GetEnumerator()ですが、クラスがすでに実装されIEnumerable<T>Tおり、値型である場合は、no-opとして機能するため、GetEnumerator()呼び出しが繰り返されて。がスローされStackOverflowExceptionます。が明らかに別のオブジェクト(これはこのオブジェクトに委任されない)であるreturn foo.Cast<T>.GetEnumerator();場合fooは安全に使用できますが、それ以外の場合は、上記のコードを使用するのがおそらく最善です。

于 2009-05-06T07:18:45.867 に答える
3

IEnumerable<T>から既に派生してIEnumerableいるため、変換を行う必要はありません。単純にキャストできます...実際には、暗黙的にキャストする必要はありません。

IEnumerable<T> enumerable = GetGenericFromSomewhere();
IEnumerable sadOldEnumerable = enumerable;
return sadOldEnumerable.GetEnumerator();

LINQ を使用すると、逆の方向に進むことはそれほど難しくありません。

var fancyEnumerable = list.OfType<GenericObject>();
return fancyEnumerable.GetEnumerator();
于 2009-05-06T06:57:16.027 に答える
1

OfType<T>とを使用できますCast<T>

public static IEnumerable Digits()
{
    return new[]{1, 15, 68, 1235, 12390, 1239};
}

var enumerable = Digits().OfType<int>();
foreach (var item in enumerable)
    // var is here an int. Without the OfType<int(), it would be an object
    Console.WriteLine(i);

IEnumerator<T>の代わりにを取得するには、IEnumerable<T>に電話をかけるだけですGetEnumerator()

var enumerator = Digits().OfType<int>().GetEnumerator();
于 2009-05-06T13:18:43.787 に答える
0

これは私にとってはうまくいきます。

IEnumerator<DataColumn> columnEnumerator = dt.Columns.Cast<DataColumn>().GetEnumerator();
于 2014-12-16T17:37:12.607 に答える