Вопрос

В C # какой самый элегантный способ создать массив объектов, от перечисления объектов? Например, в этом случае у меня есть перечислетель, который может возвращать байты, поэтому я хочу преобразовать это в байт [].

Редактировать: код, который создает перечислитель:

IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
Это было полезно?

Решение

Предполагая, что у вас есть Ienumerableu003CT>, вы можете использовать Перечислите Метод расширения:

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

byte[] result = udpDnsPacket.ToArray();

Другие советы

ОК, поэтому, предполагая, что у вас есть фактический перечислетель (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 или больше.

Так как у вас есть IEnumerator<byte> И не ан IEnumerable<byte>, вы не можете использовать LINQ ToArray метод. ToArray является метод расширения на IEnumerable<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;
}

Что произойдет, это то, что вы повторяете свой элемент перечислетеля по элементу и добавляете их в массив, который постепенно увеличивается в размере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top