3 votes

Comment référencer une valeur dans un tableau C# ?

J'ai le tableau suivant :

int[] myArray = {21,21,364,658,87};

et une référence au deuxième élément comme ceci :

int rr = myArray[1];

i rr = 500

Console.writeLine(myArray[1]);// ---> should print 500 !

J'espère que vous avez compris mon idée, je peux faire cela facilement en python comme l'exemple ci-dessus. donc
comment faire cela en C#

5voto

Nahum Litvin Points 2593

Ma solution serait probablement de créer une propriété avec arr[1] comme propriété d'appui

quelque chose comme :

  public int rr
  {
    set{ arr[1] = value;}
    get{ return arr[1];}
  }

et que rr=500; sera le même que arr[1]=500;

4voto

armen.shimoon Points 3478

Vous pourriez utiliser quelque chose comme ça :

public static class ArrayExtensions
{
    public static Action<int> CreateSetter(this int[] array, int index)
    {
        return (value) => array[index] = value;
    }
}

[TestFixture]
public class ArrayTest
{
    [Test]
    public void Test()
    {
        int[] myArray = {21,21,364,658,87};
        Action<int> rr = myArray.CreateSetter(1);
        rr(500);
        Assert.AreEqual(500, myArray[1]);
    }
}

2voto

Quand tu fais ça :

int[] myArray = {21,21,364,658,87};
int rr = myArray[1];
rr = 500;

Vous ne ferez qu'écraser la valeur dans rr, il n'y a aucun moyen pour vous d'obtenir l'adresse mémoire réelle des éléments internes d'un tableau, et donc de le mettre à jour.

Ma réponse doit donc être :

myArray[1] = 500;

J'essaie de comprendre ce que vous essayez de faire, si vous voulez encapsuler votre changement dans une fonction, vous pouvez passer la référence de cette façon, mais tout dépend de ce que vous voulez en faire :

    public void Proc()
    {
        var ints = new [] { 1, 2, 3, 4 };
        FunctionChangingByReference(ref ints[1]);
    }

    public void FunctionChangingByReference(ref int x)
    {
        x = 500;
    }

En C#, il n'y a pas de pointeurs, seulement des références.

(Je mens un peu, vous pourriez utiliser des pointeurs si vous créez un contexte non sécurisé, mais nous ne faisons pas cela en C#, et vous ne devriez pas non plus. Lorsque nous codons en C++, nous le faisons, mais c'est du C++, et nous le faisons à un coût, nous rendons le code un peu plus fragile et sujet aux erreurs. Lorsque je code en C#, j'essaie d'optimiser le code à un niveau plus élevé que le brassage des adresses mémoire. Si vous avez vraiment besoin d'optimiser à ce niveau, vous devriez écrire le code en C++ et importer ce code en tant que DLL, ce qui vous permet de bien séparer les préoccupations, et n'oubliez pas de tester le développement).

1voto

Joe Shanahan Points 592

Tout simplement myArray[1] = 500 ! Vous pourriez utiliser une propriété comme Nahum Litvin l'a suggéré si vous voulez spécifiquement une référence à un entier spécifique dans le tableau.

1voto

Jasd Points 1627

La réponse de @des a éveillé mon intérêt. J'ai donc essayé sa solution et elle fonctionne comme prévu :

int[] numbers = new[] { 1, 2, 3 };
fixed (int* number = &numbers[0])
{
  *number = 10;
}
Console.WriteLine(String.Join(", ", numbers)); // Outputs "10, 2, 3"

Vous devez le compiler avec l'option /unsafe option.

J'espère que vous comprenez que cela peut entraîner certains problèmes.
Par conséquent, Je ne recommande pas cette solution .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X