简体   繁体   English

C# - 如何从枚举器创建数组

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM