2016-08-05 5 views
3
byte[] result = memStream.ToArray();        
memStream.Close(); 
byte[] temp = result.Take(255); 
var str = System.Text.Encoding.Default.GetString(temp); 

d'échec ci-dessus sur la ligne result.Take(255);. Il dit que je ne peux pas convertir IEnumerable en byte[], et demande s'il me manque un casting.Utilisation Take() pour récupérer les octets sur un tableau d'octets, de la difficulté reconversion byte [] après la prise()

Je suis nouveau en C#, je ne sais pas trop quoi faire.

Répondre

7

Take() retourne un objet recenseur qui exécute lorsque vous énumérez il:

enter image description here

Ce n'est pas un tableau, vous ne pouvez pas l'attribuer à une référence à un tableau d'octets. Cependant, avec LINQ, vous pouvez prendre toute séquence et convertir à un tableau du type approprié en appelant sa méthode ToArray():

byte[] temp = result.Take(255).ToArray(); 

ToArray() énumère le résultat de Take(255), met les résultats dans un nouveau tableau, et retourne le tableau.

C'est un peu déroutant parce que vous pouvez énumérer un tableau comme vous pouvez énumérer ce que vous obtenez de Take(255) - mais vous pouvez énumérer beaucoup de choses. C'est juste un comportement qu'ils ont en commun, mais ils sont en réalité des objets très différents.

Vous pouvez attribuer à l'un IEnumerable<byte>:

IEnumerable<byte> a = result.Take(255); 
IEnumerable<byte> b = result.Take(255).ToArray(); 

... parce que c'est une chose qu'ils ont vraiment en commun.

+0

Merci pour votre aide! Pourriez-vous expliquer pourquoi le vôtre fonctionne et le mien ne fonctionne pas? – MrDysprosium

+0

@MrDysprosium Je vais mettre à jour ma réponse avec un peu plus de détails. –

0

La raison pour laquelle votre code donne une erreur est que .Take(result) renvoie un type IEnumerable<byte> et que vous essayez de l'affecter à un tableau byte[]. .Take() est une méthode LINQ et c'est généralement la façon dont toutes les méthodes LINQ fonctionnent dans le but de chaîner (par exemple result.Skip (5) .Take (10)).

La méthode .ToArray() prend un résultat IEnumerable<T> et le transforme en T[]. Ainsi, l'ajout .ToArray() à votre ligne va résoudre votre problème:

byte[] temp = result.Take(255).ToArray(); 

Au lieu d'utiliser .Take() puis créer un autre tableau, vous trouverez probablement ce plus performant:

byte[] temp = new byte[255] 
Array.Copy(result, temp, 255); 

La raison est parce que .ToArray() a Aucune idée de la taille du tableau qui en résulte, il doit donc choisir une taille relativement petite et plus d'éléments sont lus, il faut redimensionner pour augmenter la capacité. Cela peut se produire des dizaines de fois, selon le nombre d'éléments, avant que le tableau ne soit assez grand pour stocker tous les éléments.