[英]C# - How to create an array from an enumerator
在C#中,從對象的枚舉器創建對象數組的最優雅方法是什么? 例如,在這種情況下,我有一個可以返回字節的枚舉器,所以我想將其轉換為byte []。
編輯:創建枚舉器的代碼:
IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
好的,假設您有一個實際的枚舉器( 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或更高版本。
假設您有一個IEnumerable <T> ,您可以使用Enumerable.ToArray擴展方法:
IEnumerable<byte> udpDnsPacket = /*...*/;
byte[] result = udpDnsPacket.ToArray();
由於您有一個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;
}
會發生的是您逐項迭代枚舉器並將它們添加到逐漸增大的數組中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.