web-dev-qa-db-fra.com

Impossible d'appliquer l'indexation avec [] à une expression de type 'System.Array' avec C #

J'essaie d'utiliser une liste contenant des tableaux de chaînes en C # mais je ne sais pas comment formater ma déclaration correctement.

private String encrypt(char[] text)
{
    Random rnd = new Random();
    string[] encrypted = new string[text.Length];

    for (int i = 0; i < text.Length; i++)
    {
        int symnumb = rnd.Next(listmin, listmax);
        encrypted[i] = alphabet[getnumber(text[i])][symnumb].ToString(); 
    }
    return string.Join("", encrypted);
}

C'est plus bas:

private int getnumber(char letter)
{
    for (int i = 0; i < 27; i++)
    {
        if (letter == alphabetc[i])
        {
            return i;
        }
    }
    return -1;
}

Je dois beaucoup de code non pertinent pour tout publier, mais "crypté" est un tableau de chaînes, "alphabet" est une liste de tableaux contenant des chaînes.

Déclarations:

public List<Array> alphabet = new List<Array>();
public char[] alphabetc = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' '};

Toute aide est la bienvenue.

14
W1k3

L'erreur est assez simple; vous ne pouvez pas utiliser d'indexeur sur un Array. Array class est une classe de base pour tous les types de tableaux, et les tableaux sont implicitement héritent de Array. Mais, Array lui-même n'a pas d'indexeur. Voici une démonstration de votre erreur:

int[] numbers = new[] {1, 2, 3, 4, 5};

numbers[2] = 11; // Okay

Array arr = numbers as Array;

arr[2] = 11; // ERROR!

Donc, si vous souhaitez utiliser l'indexeur, changez votre type d'élément en un tableau de quelque chose par exemple:

public List<string[]> alphabet = new List<string[]>();
19
Selman Genç

Essayez d'utiliser .ElementAt. Il fonctionne sur tout ce qui implémente IEnumerable, y compris les collections qui ne sont pas indexées.

référence MSDN .

J'ai divisé votre déclaration en plusieurs déclarations afin qu'il soit plus facile d'identifier la ligne incriminée.

Veuillez noter - ElementAt est une méthode d'extension et vous devrez utiliser le System.Linq espace de noms pour l'utiliser.

using System.Linq;

Puis dans votre méthode:

var n = getnumber(text.ElementAt(i));

var items = alphabet.ElementAt(n);

encrypted[i] = items.ElementAt(symnumb).ToString();
12
PeteGO

Vous ne devez pas utiliser le type Array dans votre code, changez donc votre

public List<Array> alphabet = new List<Array>();

en par ex.

public List<string[]> alphabet = new List<string[]>();

ou

public List<List<string>> alphabet = new List<List<string>>();

Si vous vous en tenez à Array pour une raison quelconque, vous ne pouvez pas utiliser expr[i] Mais devrez faire expr.GetValue(i), mais je le décourage car le type de retour déclaré est object, et vous vous retrouverez avec beaucoup de casting.

6