Можно ли использовать инициализатор коллекции для словарных статей?
Я хочу использовать инициализатор коллекции для следующего бита кода:
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"
...
но каков правильный синтаксис для этого?
7 ответов:
синтаксис немного отличается:
Dictionary<int, string> names = new Dictionary<int, string>() { { 1, "Adam" }, { 2, "Bart" } }
обратите внимание, что вы эффективно добавление кортежей значений.
в качестве побочного Примечания: инициализаторы коллекции содержат аргументы, которые в основном являются аргументами для любого добавить() функция, которая пригодится в отношении типа аргумента времени компиляции. То есть, если у меня есть коллекция:
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!" };
вопрос с тегами
c#-3.0
, но для полноты я упомяну новый синтаксис, доступный с C# 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>
или изменение типов ключа или значения на более поздний срок. Если вы делаете что-то подобное на странице razor 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" } };