7
votes

Référencer une partie d'un tableau en C #

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.

J'ai pensé à quelque chose comme une arrayegment, mais cela semble ne pas travailler dans mon cas (ni peut-être que je me trompe?).

Alors, comment passer une partie d'une matrice à une méthode, car c'était un tableau lui-même?

Merci pour vos réponses!

acclamations


4 commentaires

Quelle est la "méthode de bonne méthode"? J'utilise actuellement une copie contraineie.


Qu'en est-il de Arraysegment 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.


5 Réponses :


11
votes

Skip et Prendre :

var subArray = array.Skip(5).Take(10);


10 commentaires

Bien, mais pas s'il veut maintenir un accès aléatoire par index.


@Dan Tao, alors il y a la toarray () 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 était je veux vraiment éviter de cloner les éléments . 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 :)



4
votes

De ce que je peux voir, vous avez deux options:

  1. 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>

  2. 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); 
    


0 commentaires

5
votes

Si vous voulez Stick sur des tableaux de base (c.-à-d. Int [] numéros), alors le moyen le plus efficace est de que vos fonctions prennent le décalage / comptent directement .

Il y a beaucoup de fonctions IO qui font quelque chose de similaire: xxx

L'autre option consiste à utiliser ienumberable et utilisez sauter / prendre < PRE> XXX

Il est important de vous rappeler que dans C #, vous ne traitez pas avec Pointeurs , vous traitez avec objets. < / p>


0 commentaires

0
votes

Une option est d'implémenter quelque chose comme lisonlycollection en termes d'implémentation ilist de manière immuable, mais exposer comme une "vue" sur une collection existante, déplaçant tout accès index de manière appropriée (et avec un nombre approprié, etc.).

Ce serait probablement une classe d'emballage pratique. Vous modifiez ensuite votre méthode pour accepter un iList au lieu d'un tableau.


0 commentaires

4
votes

J'avais exactement la même idée que Skeet Jon : implémenter une enveloppe autour d'un t [] qui fournit un accès aléatoire par index, gérant automatiquement le réglage de l'accès indexé pour vous.

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): xxx

voici une démo: xxx

sortie: < / p> xxx


0 commentaires