Can I use a collection initializer for Dictionary<TKey, TValue> entries?
我要对下一位代码使用集合初始值设定项:
1 2 3 4 5 6 7 8
| public Dictionary <int, string> GetNames ()
{
Dictionary <int, string> names = new Dictionary <int, string>();
names .Add(1, "Adam");
names .Add(2, "Bart");
names .Add(3, "Charlie");
return names ;
} |
所以通常应该是这样的:
1 2 3 4 5
| return new Dictionary <int, string>
{
1, "Adam",
2, "Bart"
... |
但正确的语法是什么?
- Check this post:Marcin-Chwedczuk.github.io/&Hellip;
- Properate duplicate of proper way to initialize a C§35;Dictionary with values already in it?
- Don't think that's a dupe,because they were asking,not for the shorthand dictionary declaration syntax,but for why the shorthan wasn't working in their(ancient)setup.
1 2 3 4 5
| var names = new Dictionary <int, string> {
{ 1, "Adam" },
{ 2, "Bart" },
{ 3, "Charlie" }
}; |
- 初始值设定项何时工作?它只适用于Dictionary子类还是也适用于ICollection>子类?
- 在C 3.0之后,可以使用var而不是声明类型,或者如果离开声明类型可以省略new Dictio...--stackoverflow.com/questions/5678216/&hellip;
- @Drzaus:使用var是一种丑陋的实践;c是一种强类型语言。
- @尼尔古兹:什么?var字面上只是省去了击键,它是隐式强类型的。
- @drzaus和它在写立即初始化的变量和稍后初始化的变量之间产生了差异。这是一种丑陋的做法。
- @Nyerguds——我猜你有权发表自己的观点,但是如果你马上初始化变量,那么使用var和重复使用SomeType obj = new SomeType...之间就没有实质上的区别了。既然你不能在没有立即初始化的情况下声明var obj;,我只是看不到问题。真的,我在努力学习,但我不能摸索你的位置。
- 我可以在vb.net中不使用linq吗?
- 这并不重要,但是如果您使用IntelliSense,使用var通常会涉及两个以上的击键;如果您已经定义了类型,那么IDE应该为您建议该类型。就糟糕的实践而言,只有当您希望集合是基类型时才会出现问题,但是代码中的小更改可能会导致IDE将其切换到扩展版本。它通常不会导致任何问题,因为它只在您不再使用任何基本实现时发生,但是它会导致隐藏结构问题,而您没有意识到。我也喜欢明确的声明。
- @Shimmy,我认为这只是多次打电话给Add的简写。我记不清具体要求是什么。
语法稍有不同:
1 2 3 4 5
| Dictionary <int, string> names = new Dictionary <int, string>()
{
{ 1, "Adam" },
{ 2, "Bart" }
} |
注意,您实际上是在添加值的元组。
另一个注意事项是:集合初始值设定项包含的参数基本上是针对编译时参数类型的任何add()函数的参数。也就是说,如果我有收藏:
1 2 3 4 5 6 7 8
| class FooCollection : IEnumerable
{
public void Add(int i) ...
public void Add(string s) ...
public void Add(double d) ...
} |
以下代码完全合法:
1
| var foos = new FooCollection () { 1, 2, 3.14, "Hello, world!" }; |
- 回答很好,我不知道!无论如何,字典初始值设定项什么时候起作用?它只适用于Dictionary子类,还是也适用于ICollection>?
- @Shimmy集合初始值设定项用于实现IEnumerable并具有Add()方法的任何内容。
- 不,我在问字典初始值设定项。
- @希米:字典是收藏品
- @但字典初始值设定项接受Add的两个参数。
- @希米:为什么这很重要?要点是,它将与实现IEnumerable的任何类一起使用,并且该类具有Add方法。如果Add方法采用3个参数,那么括号中需要3个对象。
- @约翰阿姨现在明白了。谢谢您!!
1 2 3 4 5
| return new Dictionary <int, string>
{
{ 1, "Adam" },
{ 2, "Bart" },
... |
这个问题被标记为c#-3.0,但为了完整性,我将提到C 6提供的新语法,以防您使用Visual Studio 2015(或Mono 4.0):
1 2 3 4 5 6
| var dictionary = new Dictionary <int, string>
{
[1] ="Adam",
[2] ="Bart",
[3] ="Charlie"
}; |
注意:其他答案中提到的旧语法仍然有效,如果您更喜欢的话。同样,为了完整性,这里是旧的语法:
1 2 3 4 5 6
| var dictionary = new Dictionary <int, string>
{
{ 1, "Adam" },
{ 2, "Bart" },
{ 3, "Charlie" }
}; |
另一种很酷的做法是,无论使用哪种语法,如果愿意,都可以保留最后一个逗号,这样就更容易复制/粘贴其他行。例如,下面的编译很好:
1 2 3 4 5 6
| var dictionary = new Dictionary <int, string>
{
[1] ="Adam",
[2] ="Bart",
[3] ="Charlie",
}; |
如果您要寻找稍微不那么冗长的语法,可以创建Dictionary的子类(或您的类型),如下所示:
1 2 3 4
| public class DebugKeyValueDict : Dictionary<string, object>
{
} |
然后像这样初始化
1 2 3 4 5 6
| var debugValues = new DebugKeyValueDict
{
{"Billing Address", billingAddress },
{"CC Last 4", card .GetLast4Digits() },
{"Response.Success", updateResponse .Success }
}); |
相当于
1 2 3 4 5 6
| var debugValues = new Dictionary <string, object>
{
{"Billing Address", billingAddress },
{"CC Last 4", card .GetLast4Digits() },
{"Response.Success", updateResponse .Success }
}); |
好处是你能得到你想要的所有编译类型的东西,比如说
用is DebugKeyValueDict代替is IDictionary。
或者在以后更改键或值的类型。如果你在一个Razor CSHTML页面中做类似的事情,你会发现这样做会更好。
当然,除了不那么冗长之外,您还可以为这个类添加额外的方法,以满足您的需要。
- 这就是viewdatadictionary在mvc-stackoverflow.com/questions/607985/&hellip中的工作原理。
- 我尝试将类型作为字典和类型数组的"别名",假设在类型化的世界中使用预定义类型更安全。当涉及到仿制药和LINQ时,结果并没有那么有用。
在下面的代码示例中,Dictionary是用StudentName类型的实例初始化的。
1 2 3 4 5 6
| Dictionary <int, StudentName > students = new Dictionary <int, StudentName >()
{
{ 111, new StudentName {FirstName ="Sachin", LastName ="Karnik", ID =211}},
{ 112, new StudentName {FirstName ="Dina", LastName ="Salimzianova", ID =317}},
{ 113, new StudentName {FirstName ="Andy", LastName ="Ruth", ID =198}}
}; |
来自MSDN
是的,我们可以在字典中使用集合初始值设定项。-
1 2 3 4 5
| Dictionary <int, string> dict = new Dictionary <int, string>();
dict .Add(1, "Mohan");
dict .Add(2, "Kishor");
dict .Add(3, "Pankaj");
dict .Add(4, "Jeetu"); |
我们可以如下初始化它。
1 2 3 4 5 6 7 8 9
| Dictionary <int, string> dict = new Dictionary <int, string>
{
{1, "Mohan" },
{2, "Kishor" },
{3, "Pankaj" },
{4, "Jeetu" }
}; |
- 已经有6个答案显示了如何做到这一点。我们不需要第7个答案显示相同的内容。