Ответ 1
var names = new Dictionary<int, string> {
{ 1, "Adam" },
{ 2, "Bart" },
{ 3, "Charlie" }
};
Я хочу использовать инициализатор коллекции для следующего бита кода:
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;
}
Так обычно это должно быть что-то вроде:
return new Dictionary<int, string>
{
1, "Adam",
2, "Bart"
...
Но какой правильный синтаксис для этого?
var names = new Dictionary<int, string> {
{ 1, "Adam" },
{ 2, "Bart" },
{ 3, "Charlie" }
};
Синтаксис несколько отличается:
Dictionary<int, string> names = new Dictionary<int, string>()
{
{ 1, "Adam" },
{ 2, "Bart" }
}
Обратите внимание, что вы эффективно добавляете кортежи значений.
В качестве инициатора sidenote: инициализаторы коллекции содержат аргументы, которые в основном являются аргументами для любой функции Add(), которая пригодится по отношению к аргументу типа компиляции. То есть, если у меня есть коллекция:
class FooCollection : IEnumerable
{
public void Add(int i) ...
public void Add(string s) ...
public void Add(double d) ...
}
следующий код совершенно легален:
var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };
return new Dictionary<int, string>
{
{ 1, "Adam" },
{ 2, "Bart" },
...
Вопрос отмечен c#-3.0
, но для полноты я упомянул новый синтаксис, доступный с С# 6, если вы используете Visual Studio 2015 (или Mono 4.0):
var dictionary = new Dictionary<int, string>
{
[1] = "Adam",
[2] = "Bart",
[3] = "Charlie"
};
Примечание: старый синтаксис, упомянутый в других ответах, по-прежнему работает, если вам это нравится. Опять же, для полноты, вот старый синтаксис:
var dictionary = new Dictionary<int, string>
{
{ 1, "Adam" },
{ 2, "Bart" },
{ 3, "Charlie" }
};
Еще одна замечательная вещь, которую следует отметить, заключается в том, что с помощью любого синтаксиса вы можете оставить последнюю запятую, если хотите, что упрощает копирование/вставку дополнительных строк. Например, следующие компилируются просто отлично:
var dictionary = new Dictionary<int, string>
{
[1] = "Adam",
[2] = "Bart",
[3] = "Charlie",
};
Если вы ищете несколько менее подробный синтаксис, вы можете создать подкласс Dictionary<string, object>
(или любой другой тип):
public class DebugKeyValueDict : Dictionary<string, object>
{
}
Затем просто выполните инициализацию
var debugValues = new DebugKeyValueDict
{
{ "Billing Address", billingAddress },
{ "CC Last 4", card.GetLast4Digits() },
{ "Response.Success", updateResponse.Success }
});
Что эквивалентно
var debugValues = new Dictionary<string, object>
{
{ "Billing Address", billingAddress },
{ "CC Last 4", card.GetLast4Digits() },
{ "Response.Success", updateResponse.Success }
});
Преимущество заключается в том, что вы получаете все необходимые для компиляции вещи, например, возможность сказать
is DebugKeyValueDict
вместо is IDictionary<string, object>
или изменения типов ключа или значения на более позднюю дату. Если вы делаете что-то подобное на странице cshtml бритвы, вам гораздо приятнее смотреть.
Помимо того, что вы менее подробны, вы можете, конечно, добавить дополнительные методы к этому классу за все, что захотите.
В следующем примере кода Dictionary<TKey, TValue>
инициализируется экземплярами типа StudentName
.
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
Да, мы можем использовать инициализатор коллекции в словаре. Если у нас есть такой словарь -
Dictionary<int,string> dict = new Dictionary<int,string>();
dict.Add(1,"Mohan");
dict.Add(2, "Kishor");
dict.Add(3, "Pankaj");
dict.Add(4, "Jeetu");
Мы можем инициализировать его следующим образом.
Dictionary<int,string> dict = new Dictionary<int,string>
{
{1,"Mohan" },
{2,"Kishor" },
{3,"Pankaj" },
{4,"Jeetu" }
};