Comment puis-je démarrer l'index dans un tableau code> code> à 1 au lieu de 0? Y a-t-il un moyen de le faire directement dans le code? P>
(Notez que je demande code> ArrayList Code>, pour les tableaux simples, veuillez vous reporter à Initialisation d'une matrice sur l'index de démarrage arbitraire en C # ) P>
8 Réponses :
Le moyen évident de le faire serait d'envelopper une arrayliste dans votre propre implémentation et de soustraire 1 de l'indexeur dans toutes les opérations utilisant l'index. P>
Vous pouvez en fait également déclarer un tableau dans .NET, qui a un arbitraire limite inférieure (faites défiler jusqu'à la section "Création de tableaux avec une liaison inférieure non nulle"). P>
Avec cela dit, veuillez ne pas le faire dans le code de production. Il est important d'être cohérent. P>
Stuff getValueAtOneBasedIndex(ArrayList<Stuff> list, index) { return list.get(index -1); }
Eh bien, vous pouvez faire la vôtre:
public class MyArrayList<T> extends ArrayList<T> { public T get(int index) { super.get(index - 1); } public void set(int index, T value) { super.set(index - 1, value); } }
Comme les autres réponses suggèrent, il existe des moyens de simuler cela, mais pas de manière directe de le faire en C # ou d'autres langues .NET couramment utilisées. Citant Eric Gunnerson : P>
Le CLR prend en charge ce genre de construire (j'ai eu du mal à ne pas utiliser le terme "travesti" ici ...), mais Il n'y a pas, à ma connaissance, tout langues qui ont une syntaxe intégrée à fais ça. P> blockQuote>
Je ne sais pas si cela le fait toujours, mais à un moment donné, Visual Basic vous permettrait de démarrer vos index de tableau à 1 avec Base d'option 1 code>
. P>
en C #, aucune des collections System.collections ne prend en charge cela, mais vous pouvez toujours écrire une classe d'emballage qui fait la traduction de l'index de vous. P>
Vraiment, cependant, cela devrait être évité. La base d'option code> de VB > a créé plus de problèmes que cela n'a été résolu, j'imagine parce qu'il a cassé des hypothèses et faisait des choses plus confuses. P>
Une raison légitime de faire cela fait des tests d'unité d'écriture. Certaines SDK 3ème partie (par exemple, Excel Com Interop) s'attendent à ce que vous travailliez avec des tableaux avec des indices à base unique. Si vous travaillez avec un tel SDK, vous pouvez et devriez étiper cette fonctionnalité dans votre cadre de test C #.
Ce qui suit devrait fonctionner: p>
object[,] comInteropArray = Array.CreateInstance( typeof(object), new int[] { 3, 5 }, new int[] { 1, 1 }) as object[,]; System.Diagnostics.Debug.Assert( 1 == comInteropArray.GetLowerBound(0), "Does it look like a COM interop array?"); System.Diagnostics.Debug.Assert( 1 == comInteropArray.GetLowerBound(1), "Does it still look like a COM interop array?");
J'ai remarqué que mon commentaire s'applique aux tableaux et non à des arraylistes. Oups. J'espère que les personnes travaillant avec Excel et VTSO le trouveront toujours utiles, même si elle se lève de la question initiale.
Voici quelque chose que j'utilise maintenant pour passer rapidement une application VBA à C #:
C'est une classe de tableau qui commence par 1 et accepte plusieurs dimensions. P>
Bien qu'il y ait un travail supplémentaire à do (ienumerator, etc ...), c'est un début, et c'est suffisant pour moi car je n'utilise que des indexeurs. p>
C'est fantastique! Je convertissez quelques vieux jeux de base de spectre et cela est inestimable.
Tout d'abord, laissez-moi préconiser cette réponse en expliquant mon cas d'utilisation: Excel Interop. Il est beaucoup plus facile de lire et d'écrire des données à l'aide de tableaux, mais Excel Plage.Value2 renvoie magiquement un tableau d'objet basé sur 1.
Donc, si vous écrivez à Excel et c'est la raison pour laquelle vous posez cette question en premier lieu ... puis peut-être arrêter de combattre C # et laissez Excel instancier le tableau pour vous. Donc, au lieu de: p> Vous pouvez utiliser: p> dans mon cas, j'ai créé une classe wrapper pour me permettre Pour utiliser un tableau pour les propriétés, comme: p> Donc, dans tous les cas, je lis dans le même index. Donc, pour faire la transition d'un modèle, je passe dans une méthode créée, je dois juste copier sur les propriétés dans le modèle qui utilise la matrice créée à partir d'Excel. P> insertingModel.data = (object[,])writeRange.Value2;
//manually copying values from one array to the other
insertingModel.Configuration = model.Configuration;
...
writeRange.Value2 = insertingModel.data;
Pourquoi voudriez-vous?
@Eric Je dirai pourquoi, dans la première année de notre université, les élèves prennent Pascal et que l'indexation commence ici de 1 alors ils ont demandé s'ils peuvent faire la même chose avec C # (juste une question).
Pourquoi ne pas utiliser
arraylist code> du tout? En .NET, au moins, il a été remplacé par les collections génériques depuis 5 ans.
Je n'ai pas dit que je veux faire ça, c'était juste une question!
Peuvent-ils faire la même chose avec C #? Oui. Devraient-ils? Non.
Lorsque vous apprenez l'espagnol, vous ne demandez pas »Y a-t-il une façon de parler anglais et de les comprendre?». Il en va de même pour les langues comptueux. Lorsque vous "parlez" une langue d'ordinateur, vous devez utiliser son vocabulaire. C # a des matrices qui commencent par 0. Si vous voulez commencer 1, écrivez Pascal.
J'ai actuellement une exigence d'entreprise qui consiste à porter le code de calcul écrit par un ingénieur dans VBA Excel et à l'intégrer dans notre architecture de service d'automatisation en C #. L'ingénieur connaît beaucoup sur les calculs et plutôt moins sur la programmation. Il a fait de son mieux et a utilisé des tableaux une manière intensive pour son algorithme d'équations linéaires. Parce que cela doit être fait, je n'ai pas le temps de perdre pour réécrire toute la logique de la matrice et j'ai maintenant une très bonne raison d'avoir des matrices spéciales qui commencent avec 1 en C #. Cela peut être fait proprement et être bien documenté. Donc, merci pour cette question.