在C#中,从对象的枚举器创建一个对象数组的最优雅的方法是什么?例如在这种情况下,我有一个可以返回字节的枚举器,所以我想将其转换为byte []。
编辑:创建枚举器的代码:
IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
答案 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}}
您会逐项迭代枚举器,并将它们添加到逐渐增大的数组中。