2013-07-19 60 views
4

值在C#2.0中,我们可以初始化数组,并列出其值是这样的:初始化字典在C#2.0

int[] a = { 0, 1, 2, 3 }; 
int[,] b = { { 0, 1 }, { 1, 2 }, { 2, 3 } }; 
List<int> c = new List<int>(new int[] { 0, 1, 2, 3 }); 

我愿做同样的解释。我知道你可以轻松地在C#3.0以上版本中这样做:

Dictionary<int, int> d = new Dictionary<int, int> { { 0, 1 }, { 1, 2 }, { 2, 3 } }; 

但它在C#2.0中不起作用。有没有使用Add或基于已有的集合的任何解决方法?

+4

什么限制你仍然使用C#2?从C#3开始,生活变得更加美好,即使你的目标是.NET 2,也值得尝试去更新一个编译器...... –

+0

哈哈,我想知道我是否应该不要回答你的问题没有。使用C#2是我不能做太多工作的一个要求。我知道较新的C#版本可以让事情变得更容易,但是由于我已经遇到了这个问题,我想我会问好奇。 –

+0

我很感兴趣,为什么*有这个要求。受限于.NET 2.0,我可以理解,但C#2似乎是一个奇怪的要求。 –

回答

10

但它在C#2.0中不起作用。有没有任何解决方法,而不使用添加或基于已经存在的集合?

public class DictionaryBuilder<TKey, TValue> 
{ 
    private Dictionary<TKey, TValue> dictionary 
     = new Dictionary<TKey, TValue> dictionary(); 

    public DictionaryBuilder<TKey, TValue> Add(TKey key, TValue value) 
    { 
     if (dictionary == null) 
     { 
      throw new InvalidOperationException("Can't add after building"); 
     } 
     dictionary.Add(key, value); 
     return this; 
    } 

    public Dictionary<TKey, TValue> Build() 
    { 
     Dictionary<TKey, TValue> ret = dictionary; 
     dictionary = null; 
     return ret; 
    } 
} 

然后你可以使用:

Dictionary<string, int> x = new DictionaryBuilder<string, int>() 
    .Add("Foo", 10) 
    .Add("Bar", 20) 
    .Build(); 

这至少

我能想到的是写自己DictionaryBuilder类型,使其更简单最接近号一个单个表达式仍然存在,这对于要在声明点初始化的字段很有用。

+0

Skeet,你的流利语法不起作用,因为'Add'不会'返回这个;'。 –

+0

@newStackExchangeInstance:已修复,谢谢。 –

+0

@机械对象:感谢您修复报价,但请不要先检查其他人的答案中的*语义*代码。我非常刻意将代码按照这种方式进行:我会认为它是一个*错误*多次添加相同的密钥;我不想默默地忽略它。 (另一种方法是使用索引器,它会覆盖旧的条目 - 而且,这会悄然隐藏一个问题。) –