簡體   English   中英

C# - 如何從枚舉器創建數組

[英]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方法。 ToArrayIEnumerable<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM