web-dev-qa-db-ja.com

C#を使用した 'System.Array'型の式に[]を使用したインデックス付けを適用できません

C#で文字列配列を含むリストを使用しようとしていますが、宣言を適切にフォーマットする方法がわかりません。

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

どんな助けも素晴らしいでしょう。

14
W1k3

エラーは非常に簡単です。 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[]>();
19
Selman Genç

.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();
12
PeteGO

コードで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、そして、あなたはたくさんのキャストになってしまいます。

6