Quero usar um inicializador de coleção para o próximo trecho de código:
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;
}
Normalmente, deve ser algo como:
return new Dictionary<int, string>
{
1, "Adam",
2, "Bart"
...
Mas qual é a sintaxe correta para isso?
Respostas:
fonte
Dictionary<TKey, TValue>
subclasses ou também funcionaráICollection<KeyValuePair<TKey, TValue>>
?var
vez do tiponew Dictio...
var
literalmente apenas economiza pressionamentos de teclas, é implicitamente fortemente digitado .var
e se repetir comSomeType obj = new SomeType...
. E como você não pode declararvar obj;
sem inicializar imediatamente, não vejo o problema. Realmente, estou tentando aprender, mas não consigo grocar sua posição.A sintaxe é um pouco diferente:
Observe que você está efetivamente adicionando tuplas de valores.
Como nota lateral: os inicializadores de coleção contêm argumentos que são basicamente argumentos para qualquer função Add () que seja útil em relação ao tipo de argumento em tempo de compilação. Ou seja, se eu tiver uma coleção:
o código a seguir é perfeitamente legal:
fonte
IEnumerable
e tenhaAdd()
métodos.Add
.IEnumerable<T>
e que tenha umAdd
método. Se oAdd
método tiver 3 parâmetros, você precisará de 3 objetos entre colchetes.fonte
A pergunta está marcada
c#-3.0
, mas para completar, mencionarei a nova sintaxe disponível com C # 6 caso você esteja usando o Visual Studio 2015 (ou Mono 4.0):Nota: a sintaxe antiga mencionada em outras respostas ainda funciona, se você preferir. Novamente, para ser completo, aqui está a sintaxe antiga:
Outro tipo de coisa interessante a se notar é que com qualquer sintaxe você pode deixar a última vírgula se desejar, o que torna mais fácil copiar / colar linhas adicionais. Por exemplo, o seguinte compila perfeitamente:
fonte
Se você está procurando uma sintaxe um pouco menos detalhada, pode criar uma subclasse de
Dictionary<string, object>
(ou qualquer que seja o seu tipo) como esta:Então é só inicializar assim
Que é equivalente a
A vantagem é que você obtém todas as coisas do tipo de compilação que você pode querer, como ser capaz de dizer
is DebugKeyValueDict
ao invés deis IDictionary<string, object>
ou alterando os tipos de chave ou valor em uma data posterior. Se você estiver fazendo algo assim em uma página cshtml do razor, é muito mais agradável de olhar.
Além de ser menos prolixo, você pode adicionar métodos extras a esta classe para o que quiser.
fonte
No exemplo de código a seguir, a
Dictionary<TKey, TValue>
é inicializado com instâncias do tipoStudentName
.do msdn
fonte
Sim, podemos usar o inicializador de coleção no dicionário. Se tivermos um dicionário como este-
Podemos inicializá-lo como segue.
fonte