J'ai la matrice contenant des données, disons, un en-tête et une vraie donnée. Je dois transmettre les données contenues dans la matrice à une méthode, mais je souhaite définitivement éviter de la copier à un autre tableau. P>
J'ai pensé à quelque chose comme une arrayegment, mais cela semble ne pas travailler dans mon cas (ni peut-être que je me trompe?). p>
Alors, comment passer une partie d'une matrice à une méthode, car c'était un tableau lui-même? P>
Merci pour vos réponses! p>
acclamations p>
5 Réponses :
Bien, mais pas s'il veut maintenir un accès aléatoire par index.
@Dan Tao, alors il y a la toarray () code> méthode d'extension.
@Darin: À ce stade, vous tombez en faute de "je veux vraiment éviter de la copier à un autre tableau".
@Jon, je pensais que ce que l'OP signifiait par Je veux certainement éviter de la copier à un autre tableau i> était je veux vraiment éviter de cloner les éléments i>. Ou peut-être que je me suis trompé?
@Dan: Dans ce cas, cela impliquera de copier tous les éléments, ce qui pourrait en effet être un gros problème.
@Darin: Je ne pense pas que c'est ce que cela signifie. Si tel est le cas, il n'y a pas de problème à la limite de l'API: la méthode doit simplement prendre un tableau, et si l'appelant doit passer une tranche (avec une copie), il créera simplement cette copie en tranches lui-même et passez ce. Il veut clairement pouvoir passer une tranche "par référence".
@Darin, @jimmy: Il est assez clair pour moi que OP veut quelque chose qui accède directement à la matrice source mais à une manière propre et encapsulée. Les éléments de copie sont précisément ce qu'il ne veut pas, sauf si je me trompe. @Jon: Voulez-vous dire pour votre dernier commentaire d'être dirigé contre moi, ou Jimmy? Il me semble que vous et moi partageons le même point de vue à ce sujet, à moins que je manque quelque chose.
@Dan: Oups, c'était censé être à Jimmy :)
@Jon: Je pensais que tu devais être censé être en vacances (er..um ... des vacances?). (Je pensais que je pourrais enfin être en mesure de répondre à une question C # ici ....)
@James: Je suis revenu ce soir ... Bien que je prévois de passer la majeure partie de la soirée à jouer aux vers rechargés :)
De ce que je peux voir, vous avez deux options:
Modifiez la méthode que vous appelez (si vous avez l'option). Au lieu d'accepter simplement un tableau (ou iEnumerable), vous pouvez l'avoir accepter un tableau, un index de démarrage et un indice de fin. P> li>
Au lieu de passer un tableau, passez dans un objet iéalable qui énumère sur la plage souhaitée dans votre réseau (sans effectuer une copie des éléments du tableau). Une façon de faire ce serait: p> li> OL>
var slice = someArray.Skip(startIndex).Take(endIndex - startIndex);
Si vous voulez Il y a beaucoup de fonctions IO qui font quelque chose de similaire: p> L'autre option consiste à utiliser ienumberable Il est important de vous rappeler que dans C #, vous ne traitez pas avec
Une option est d'implémenter quelque chose comme em> Ce serait probablement une classe d'emballage pratique. Vous modifiez ensuite votre méthode pour accepter un lisonlycollection
ilist
iList
J'avais exactement la même idée que Skeet Jon : implémenter une enveloppe autour d'un J'ai jeté une mise en œuvre rapide tout à l'heure (sauter à l'avance au bas de cette réponse pour une démonstration courte): p> voici une démo: p> sortie: < / p> t [] code> qui fournit un accès aléatoire par index, gérant automatiquement le réglage de l'accès indexé pour vous.
Quelle est la "méthode de bonne méthode"? J'utilise actuellement une copie contraineie.
Qu'en est-il de
Arraysegment code> ne fonctionne pas pour vous?
Vous voudrez peut-être également reconsidérer votre structure de données. L'en-tête et les données réelles sonnent comme deux choses distinctes, qui doivent être conservées séparément.
Vous devriez modifier votre question à mentionner que vous utilisez la contrainte de contrainte. Ce pourrait être une information importante.