代码之家  ›  专栏  ›  技术社区  ›  Greg

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

  •  9
  • Greg  · 技术社区  · 14 年前

    在C#中,从对象枚举器创建对象数组最优雅的方法是什么?e、 在这个例子中,我有一个可以返回字节的枚举器,所以我想把它转换成byte[]。

    IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
    
    3 回复  |  直到 7 年前
        1
  •  5
  •   dtb    14 年前

    假设你有一个 IEnumerable<T> ,您可以使用 Enumerable.ToArray 扩展方法:

    IEnumerable<byte> udpDnsPacket = /*...*/;
    
    byte[] result = udpDnsPacket.ToArray();
    
        2
  •  26
  •   Brian Genisio    14 年前

    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();
    

    当然,所有这些都假设您使用的是.NET3.5或更高版本。

        3
  •  3
  •   Benjamin Hodgson    7 年前

    IEnumerator<byte> 而不是一个 IEnumerable<byte> ToArray 方法。 ToArray公司 是一个 extension method 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;
    }