[英]C# - How to create an array from an enumerator
In C#, what's the most elegant way to create an array of objects, from an enumerator of objects? 在C#中,从对象的枚举器创建对象数组的最优雅方法是什么? eg in this case I have an enumerator that can return byte's, so I want to convert this to byte[].
例如,在这种情况下,我有一个可以返回字节的枚举器,所以我想将其转换为byte []。
EDIT: Code that creates the enumerator: 编辑:创建枚举器的代码:
IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
OK, So, assuming that you have an actual enumerator ( IEnumerator<byte>
), you can use a while loop: 好的,假设您有一个实际的枚举器(
IEnumerator<byte>
),您可以使用while循环:
var list = new List<byte>();
while(enumerator.MoveNext())
list.Add(enumerator.Current);
var array = list.ToArray();
In reality, I'd prefer to turn the IEnumerator<T>
to an IEnumerable<T>
: 实际上,我更喜欢将
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;
}
}
Then, you can get the array: 然后,你可以得到数组:
var array = enumerator.ToEnumerable().ToArray();
Of course, all this assumes you are using .Net 3.5 or greater. 当然,所有这些都假设您使用的是.Net 3.5或更高版本。
Assuming you have an IEnumerable<T> , you can use the Enumerable.ToArray extension method: 假设您有一个IEnumerable <T> ,您可以使用Enumerable.ToArray扩展方法:
IEnumerable<byte> udpDnsPacket = /*...*/;
byte[] result = udpDnsPacket.ToArray();
Since you have an IEnumerator<byte>
and not an IEnumerable<byte>
, you cannot use Linq's ToArray
method. 由于您有一个
IEnumerator<byte>
而不是IEnumerable<byte>
,因此您无法使用Linq的ToArray
方法。 ToArray
is an extension method on IEnumerable<T>
, not on IEnumerator<T>
. ToArray
是IEnumerable<T>
上的扩展方法 ,而不是IEnumerator<T>
上的扩展方法 。
I'd suggest writing an extension method similar to Enumerable.ToArray
but then for the purpose of creating an array of your enumerator: 我建议编写一个类似于
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;
}
What happens is that you iterate your enumerator item by item and add them to an array that is gradually increasing in size. 会发生的是您逐项迭代枚举器并将它们添加到逐渐增大的数组中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.