基于for循环位置创建Dictionary的键

时间:2011-07-05 11:18:42

标签: c# .net dictionary c#-3.0

我要去一个目录,拿起一些文件,然后将它们添加到字典中。

第一次在循环中,键需要是A,第二次是B等.Afer 26 / Z数字表示不同的字符,从33开始,它以小写字母a开头,最多49字,小写q。

如果i == 1没有大量的if语句,那么Key就是'A'等等我怎样才能保持这段代码的整洁?

4 个答案:

答案 0 :(得分:4)

听起来你只需要保留你所到之处的索引,然后是一些映射函数:

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

编辑:我更新了MapIndexToKey方法,使其更简单。如果您只使用单个字符,那么为什么要使用字符串键并不清楚...

另一个编辑:我相信你实际上可以使用:

string key = ((char) (index + 'A')).ToString();
根据您的要求,

根本没有映射函数,因为字符在Unicode顺序中与'A'连续...

答案 1 :(得分:1)

继续从101递增到132,忽略丢失的序列,并将它们转换为字符。 http://www.asciitable.com/

使用提醒(除以132)来识别第二个循环

答案 2 :(得分: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
     }

答案 3 :(得分:0)

怎么样:

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