C # - Как создать массив из перечисления
-
30-09-2019 - |
Вопрос
В 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;
}
Что произойдет, это то, что вы повторяете свой элемент перечислетеля по элементу и добавляете их в массив, который постепенно увеличивается в размере.