C# - 如何从枚举器创建数组

时间:2010-08-21 12:39:45

标签: c# arrays enumerator

在C#中,从对象的枚举器创建一个对象数组的最优雅的方法是什么?例如在这种情况下,我有一个可以返回字节的枚举器,所以我想将其转换为byte []。

编辑:创建枚举器的代码:

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

3 个答案:

答案 0 :(得分:20)

好的,假设你有一个实际的枚举器(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或更高版本。

答案 1 :(得分:10)

假设您有IEnumerable<T>,则可以使用Enumerable.ToArray扩展方法:

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

byte[] result = udpDnsPacket.ToArray();

答案 2 :(得分:2)

由于您有IEnumerator<byte>而不是IEnumerable<byte>,因此您无法使用Linq的ToArray方法。 ToArray IEnumerable<T>上的extension method,而不是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; } 的扩展方法,但是为了创建枚举数组的目的:

{{1}}

您会逐项迭代枚举器,并将它们添加到逐渐增大的数组中。

相关问题