1

重複の可能性:
C#でアルファベットの文字の配列を生成する

(理論的な質問だけで、フィルタリングシステムを書くこととしてそれを考えていました(アルファベットを使用していませんが、私は考えさせられました))。

たとえば、英語のアルファベットのすべての大文字(AZ)と「All」という単語のフィルターリストを作成するとします。

All A B C D E ... X Y Z 

List<string>そして、ハードコードされた方法を使用せずに、C#でこれを行うための最も効率的な方法に変換し{"A","B"}ます。

この質問の複製ではありません

上記の質問は、ALL部分を許可しない、単純で単純な文字配列への変換を扱っています。そしてそれを取り入れて変換するには、少なくともコピーとキャストが必要になると思います。

4

5 に答える 5

2

実際のキャラクターでそれを行うこともできます:

List<string> characters = new List<string>();

for (char c = 'A'; c <= 'Z'; c++)
    characters.Add("" + c);
于 2012-07-29T20:56:57.490 に答える
2

List<>「最も効率的な」ためには、LINQを避けようとします。

  var sb = new StringBuilder("All", 26+3 +spare);
  for (char c = 'A'; c <= 'Z'; c++)  sb.Append(c);

  string result = sb.ToString();

しかし、正直に言うと、ここでさまざまな答えをベンチマークする必要があります。

于 2012-07-29T22:35:24.840 に答える
1

各文字列文字はchar、ASCII番号を持つ値です。キャピタルAは65から始まり、キャピタルZは90です。したがって、ループを使用して値を生成できます。

List<string> alpha = new List<string>();
for(int i=65; i <=90; i++) {
   alpha.add(""+(char)i);
}

編集:

forループの文字リテラルを次のように使用することもできます。

for(int i = (int)'A'; i <= (int)'Z'; i++)
于 2012-07-29T20:48:25.957 に答える
1

例えば:

var alphabet = new List<String>(27);
var capitalRange = Enumerable.Range(0, 26)
    .Select(i => new String(Convert.ToChar(i + 65), 1));
alphabet.AddRange( capitalRange );
alphabet.Add("All");

正しい容量でリストを初期化すると、サイズを変更する必要がなく、サイズが大きくなりすぎることもありません。それを除けば、これはforループに似ています。文字列コンストラクタは、よりわずかに高速ですChar.ToString()

于 2012-07-29T20:52:08.247 に答える
0

これを行うためのかなりコンパクトな方法は次のとおりです。

var list = new[] { "All" }.Concat(
    Enumerable.Range('A', 'Z' - 'A' + 1)
    .Select(c => ((char)c).ToString())
).ToList();

ただし、このようなものは、サイズ変更がないため、よりクリーン(IMO)で効率的です。

const char start_ch = 'A';
const char end_ch = 'Z';

var list = new List<string>(end_ch - start_ch + 1) { "All" };

for (char ch = start_ch; ch <= end_ch; ++ch)
    list.Add(ch.ToString());

これで正確に何をするつもりListですか?たとえば、HashSetまたはのような連想データ構造を代わりに使用して、検索をより効率的に行うことができますDictionary

于 2012-07-29T21:36:21.880 に答える