在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;
}

发生的事情是,您可以通过项目迭代枚举商,并将它们添加到逐渐增加的数组中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top