2011-07-05 7 views
4

私はいくつかのファイルをピックアップして辞書に追加するディレクトリに行きます。forループの位置に基づいて辞書のキーを作る

ループで初めてキーはA、2回目のBなどでなければなりません。Afer 26/Z数字は異なる文字を表し、33からは小文字のaから小文字のqで始まります。

if == 1であればKeyは 'A'などと言っても大したif文はありません。どうすればこのコードをきれいに保つことができますか?

int index = 0; 
foreach (...) 
{ 
    ... 
    string key = MapIndexToKey(index); 
    dictionary[key] = value; 
    index++; 
} 

... 

// Keys as per comments 
private static readonly List<string> Keys = 
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopq" 
    .Select(x => x.ToString()) 
    .ToList(); 

// This doesn't really need to be a separate method at the moment, but 
// it means it's flexible for future expansion. 
private static string MapIndexToKey(int index) 
{ 
    return Keys[index]; 
} 

EDIT:あなたはちょうどあなたが、その後、いくつかのマッピング機能を持っているところのインデックスを維持する必要があるよう

答えて

4

はね、私はそれを簡単にするためにMapIndexToKey方法を更新しました。それはあなたが、文字列のキーをしたいなぜあなたはしかかかわらず単一の文字を使用している場合は明らかではありません...

別の編集:私はあなたが実際には使用することができます信じる:

string key = ((char) (index + 'A')).ToString(); 

代わりにマッピング機能を持ちます文字列が 'A'からUnicode順で連続しているため、すべての条件を満たすことができます。

+0

私はそれの要点を得るが、一度私はmyDicionary.Add(generateKey、myvalue)を行うでしょう。 – Jon

+0

@Jon:なぜインデクサーを使って 'Add'するのが好きですか? –

+0

1行のコード?私はちょうど次の問題を発見しました。0-26は大文字で、26-32は奇妙な文字で、33-49は小文字ですが、char/intキャスティングは機能しません。 – Jon

1

欠落しているシーケンスを無視して101から132に増分し、文字に変換してください。第二のループにについてどのように

0

識別するためのhttp://www.asciitable.com/

使用リマインダー(132で割る):

for(int i=0; i<26; ++i) 
{ 
    dict[(char)('A'+ (i % 26))] = GetValueFor(i); 
} 
+0

良い試みですが、私のループは26を過ぎています – Jon

+0

%26(編集参照):-) – nakhli

1

は、これはあなたにおそらく注文アルファベットではない、特定の番号に文字をマッピングする機会を与えてくれます。

var letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
     .Select((chr, index) => new {character = chr, index = index + 1 }); 

    foreach(var letter in letters) 
    { 
     int index = letter.index; 
     char chr = letter.character; 
       // do something 
    } 
関連する問題