C # - Comment créer un tableau à partir d'un recenseur
-
30-09-2019 - |
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();
La solution
En supposant que vous avez IEnumerable
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.