Question

En C #, ce qui est la façon la plus élégante pour créer un tableau d'objets, à partir d'un recenseur d'objets? par exemple. dans ce cas, j'ai un énumérateur qui peut revenir octet de, donc je veux convertir en octet [].

EDIT: Code qui crée le recenseur:

IEnumerator<byte> enumerator = updDnsPacket.GetEnumerator();
Était-ce utile?

La solution

En supposant que vous avez IEnumerable , vous pouvez utiliser Enumerable.ToArray méthode d'extension:

IEnumerable<byte> udpDnsPacket = /*...*/;

byte[] result = udpDnsPacket.ToArray();

Autres conseils

OK, donc, en supposant que vous avez un recenseur réel (IEnumerator<byte>), vous pouvez utiliser une boucle while:

var list = new List<byte>();
while(enumerator.MoveNext())
  list.Add(enumerator.Current);
var array = list.ToArray();

En réalité, je préférerais tourner le IEnumerator<T> à un IEnumerable<T>:

public static class EnumeratorExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this IEnumerator<T> enumerator)
    {
      while(enumerator.MoveNext())
          yield return enumerator.Current;
    }
}

Ensuite, vous pouvez obtenir le tableau:

var array = enumerator.ToEnumerable().ToArray();

Bien sûr, tout cela suppose que vous utilisez .Net 3.5 ou plus.

Puisque vous avez IEnumerator<byte> et non un IEnumerable<byte> , vous ne pouvez pas utiliser de LINQ ToArray méthode. ToArray est méthode d'extension sur IEnumerable<T>, et non sur IEnumerator<T>.

Je vous suggère d'écrire une méthode d'extension similaire à Enumerable.ToArray mais dans le but de créer un tableau de votre recenseur:

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

Qu'est-ce qui se passe est que vous itérer votre article recenseur par article et les ajouter à un tableau qui augmente progressivement en taille.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top