15

C# で、オブジェクトの列挙子からオブジェクトの配列を作成する最もエレガントな方法は何ですか? たとえば、この場合、バイトを返すことができる列挙子があるので、これを byte[] に変換します。

編集:列挙子を作成するコード:

IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
4

3 に答える 3

28

OK、実際の列挙子 ( IEnumerator<byte>) があると仮定すると、while ループを使用できます。

var list = new List<byte>();
while(enumerator.MoveNext())
  list.Add(enumerator.Current);
var array = list.ToArray();

実際には、 を に変えたいと思いIEnumerator<T>ますIEnumerable<T>:

public static class EnumeratorExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this IEnumerator<T> enumerator)
    {
      while(enumerator.MoveNext())
          yield return enumerator.Current;
    }
}

次に、配列を取得できます。

var array = enumerator.ToEnumerable().ToArray();

もちろん、これはすべて、.Net 3.5 以降を使用していることを前提としています。

于 2010-08-21T12:53:21.280 に答える
5

IEnumerable<T>があると仮定すると、 Enumerable.ToArray拡張メソッドを使用できます。

IEnumerable<byte> udpDnsPacket = /*...*/;

byte[] result = udpDnsPacket.ToArray();
于 2010-08-21T12:41:17.753 に答える
3

があってIEnumerator<byte>ではないため、Linq のメソッドIEnumerable<byte>を使用することはできません。onではなく onの拡張メソッドです。ToArrayToArrayIEnumerable<T>IEnumerator<T>

Enumerable.ToArray列挙子の配列を作成する目的で、次のような拡張メソッドを作成することをお勧めします。

public T[] ToArray<T>(this IEnumerator<T> source)
{
    T[] array = null;
    int length = 0;
    T t;
    while (source.MoveNext())
    {
        t = source.Current();
        if (array == null)
        {
            array = new T[4];
        }
        else if (array.Length == length)
        {
            T[] destinationArray = new T[length * 2];
            Array.Copy(array, 0, destinationArray, 0, length);
            array = destinationArray;
        }
        array[length] = t;
        length++;
    }
    if (array.Length == length)
    {
        return array;
    }
    T[] destinationArray = new T[length];
    Array.Copy(array, 0, destinationArray, 0, length);
    return destinationArray;
}

何が起こるかというと、列挙子の項目を項目ごとに繰り返し、それらを徐々にサイズが大きくなる配列に追加することです。

于 2010-08-21T12:54:26.200 に答える