wake-up-neo.net

No se puede aplicar la indexación con [] a una expresión de tipo 'System.Array' con C #

Estoy tratando de usar una lista que contiene matrices de cadenas en C # pero no sé cómo formatear mi declaración correctamente.

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);
}

Esto está más abajo:

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

Tengo mucho código irrelevante para publicarlo todo, pero "encriptado" es una matriz de cadenas, "alfabeto" es una lista de matrices que contienen cadenas.

Declaraciones:

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', ' '};

Cualquier ayuda sería genial.

14
W1k3

El error es bastante sencillo; no puede usar un indexador en un Array. La clase Array es una clase base para todos los tipos de matriz, y las matrices son implícitamente heredadas de la matriz. Pero, Array en sí no tiene un indexador. Aquí hay una demostración de su error:

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

numbers[2] = 11; // Okay

Array arr = numbers as Array;

arr[2] = 11; // ERROR!

Entonces, si desea usar el indexador, cambie su tipo de elemento a una matriz de algo, por ejemplo:

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

Intenta usar .ElementAt. Funciona en cualquier cosa que implemente IEnumerable, incluidas las colecciones que no están indexadas.

referencia de MSDN .

He dividido su declaración en varias declaraciones para que sea más fácil identificar la línea ofensiva.

Tenga en cuenta que ElementAt es un método de extensión y deberá utilizar System.Linq espacio de nombres para usarlo.

using System.Linq;

Luego en tu método:

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

var items = alphabet.ElementAt(n);

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

No debe usar el tipo Array en su código, así que cambie su

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

en p.

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

o

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

Si se queda con Array por alguna razón, no puede usar expr[i] Pero tendrá que hacer expr.GetValue(i), pero lo desaconsejo porque el tipo de retorno declarado es object, y terminarás con mucho casting.

6
Jeppe Stig Nielsen