Невозможно применить индексирование с [] к выражению типа "System.Array" с С#
Я пытаюсь использовать список, содержащий строковые массивы в С#, но я не знаю, как правильно отформатировать мое объявление.
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);
}
Это еще ниже:
private int getnumber(char letter)
{
for (int i = 0; i < 27; i++)
{
if (letter == alphabetc[i])
{
return i;
}
}
return -1;
}
Мне нужно много неулокального кода, чтобы опубликовать все это, но "зашифрованный" - это строковый массив, "алфавит" - это список массивов, содержащих строки.
Объявления:
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', ' '};
Любая помощь будет отличной.
Ответы
Ответ 1
Ошибка довольно проста; Вы не можете использовать индексатор на Array
. Класс Array
является базовым классом для всех типов массивов, и массивы неявно наследуются от Array. Но у самого Array
нет индексатора. Вот демонстрация вашей ошибки:
int[] numbers = new[] {1, 2, 3, 4, 5};
numbers[2] = 11; // Okay
Array arr = numbers as Array;
arr[2] = 11; // ERROR!
Поэтому, если вы хотите использовать индексатор, измените тип элемента на массив чего-нибудь, например:
public List<string[]> alphabet = new List<string[]>();
Ответ 2
Попробуйте использовать .ElementAt
. Он работает во всем, что реализует IEnumerable, включая коллекции, которые не индексируются.
Ссылка MSDN.
Я разделил ваш оператор на несколько операторов, чтобы было легче идентифицировать линию нарушения.
Обратите внимание: ElementAt - это метод расширения, и вам нужно будет использовать пространство имён System.Linq
, чтобы использовать его.
using System.Linq;
Затем в вашем методе:
var n = getnumber(text.ElementAt(i));
var items = alphabet.ElementAt(n);
encrypted[i] = items.ElementAt(symnumb).ToString();
Ответ 3
Вы не должны использовать тип Array
в своем коде, поэтому измените
public List<Array> alphabet = new List<Array>();
в, например,
public List<string[]> alphabet = new List<string[]>();
или
public List<List<string>> alphabet = new List<List<string>>();
Если вы по какой-то причине придерживаетесь Array
, вы не можете использовать expr[i]
, но должны будете делать expr.GetValue(i)
, но я отговариваю его, потому что объявленный тип возврата object
, и вы получите много литья.