题
在C#中,从对象的枚举器中创建一系列对象的最优雅方法是什么?例如,在这种情况下,我有一个可以返回字节的枚举者,因此我想将其转换为字节[]。
编辑:创建枚举器的代码:
IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
解决方案
假设你有一个 ienumerableu003CT>, ,您可以使用 枚举 扩展方法:
IEnumerable<byte> udpDnsPacket = /*...*/;
byte[] result = udpDnsPacket.ToArray();
其他提示
好的,因此,假设您有一个实际的枚举者(IEnumerator<byte>
),您可以使用一个时循环:
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;
}
发生的事情是,您可以通过项目迭代枚举商,并将它们添加到逐渐增加的数组中。
不隶属于 StackOverflow