Dictionary <TKey, TValue> 항목에 컬렉션 이니셜 라이저를 사용할 수 있습니까?


94

다음 코드 비트에 컬렉션 이니셜 라이저를 사용하고 싶습니다.

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"
   ...

그러나 이것에 대한 올바른 구문은 무엇입니까?


이 게시물을 확인하십시오 marcin-chwedczuk.github.io/...
csharpfolk


속기 사전 선언 구문이 아니라 왜 속기가 (고대) 설정에서 작동하지 않았는지 물어 봤기 때문에 속임수라고 생각하지 마십시오.
NH.

답변:


157
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};

1
이니셜 라이저는 언제 작동합니까? Dictionary<TKey, TValue>하위 클래스 에만 해당 ICollection<KeyValuePair<TKey, TValue>>됩니까 아니면 작동 합니까?
Shimmy Weitzhandler

C # 3.0 후에 사용할 수 있습니다 var선언하는 형태 대신에, 또는 선언 형식을 떠나는 것은 생략 할 수있는 경우 new Dictio...- stackoverflow.com/questions/5678216/...
drzaus

1
@drzaus : var를 사용하는 것은 추악하고 추한 연습입니다. C #은 강력한 형식의 언어입니다.
Nyerguds 2014

1
@Nyerguds : 뭐? var문자 그대로 키 입력을 저장하고 암시 적으로 강력하게 입력 됩니다.
drzaus

4
@Nyerguds-당신은 당신의 의견에 대한 권리가 있다고 생각합니다.하지만 변수를 즉시 초기화하는 경우 문자 그대로를 사용하는 var것과 반복하는 것 사이에는 차이가 없습니다 SomeType obj = new SomeType.... 그리고 var obj;즉시 초기화하지 않으면 선언 할 수 없기 때문에 문제가 보이지 않습니다. 정말 배우려고 노력하고 있지만 당신의 입장을 알아 차리지 못합니다.
drzaus

36

구문은 약간 다릅니다.

Dictionary<int, string> names = new Dictionary<int, string>()
{
    { 1, "Adam" },
    { 2, "Bart" }
}

값의 튜플을 효과적으로 추가하고 있습니다.

참고로 컬렉션 이니셜 라이저에는 기본적으로 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!" };

좋은 대답, 나는 그것에 대해 몰랐습니다! 어쨌든 사전 이니셜 라이저는 언제 작동합니까? Dictionary <TKey, TValue> 하위 클래스에만 해당합니까 아니면 ICollection <KeyValuePair <TKey, TValue >>에서도 작동합니까?
Shimmy Weitzhandler

@Shimmy 컬렉션 이니셜 라이저 는 메소드 를 구현 IEnumerable 하고 가지고있는 모든 것에 대해 작동 Add()합니다.
Anton Gogolev

@Shimmy : 사전 모음입니다
존 손더스

@JohnSaunders 그러나 딕셔너리 이니셜 라이저는 Add.
Shimmy Weitzhandler

2
@Shimmy : 그게 왜 중요할까요? 요점은 구현 하고 메서드 가있는 모든 클래스에서 작동한다는 것입니다 . 는 IF 방법이 걸리는 3 개 매개 변수를, 당신은 괄호 3 개체가 필요합니다. IEnumerable<T>AddAdd
John Saunders

11
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...

10

질문은 태그가 지정 c#-3.0되어 있지만 완전성을 위해 Visual Studio 2015 (또는 Mono 4.0)를 사용하는 경우 C # 6에서 사용할 수있는 새로운 구문을 언급하겠습니다.

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",
};

5

좀 덜 장황한 구문을 찾고 있다면 다음 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 페이지에서 이와 같은 작업을 수행하는 경우보기가 훨씬 더 좋습니다.

덜 장황 할뿐만 아니라 원하는대로이 클래스에 추가 메서드를 추가 할 수 있습니다.


- ViewDataDictionary가 MVC에서 작동하는 방법이 기본적으로 stackoverflow.com/questions/607985/...
Simon_Weaver

사전 정의 된 유형을 사용하는 것이 유형화 된 세계에서 더 안전 할 것이라고 가정하여 사전 및 유형화 된 배열에 대한 '별칭'으로 유형을 실험했습니다. 제네릭과 linq에 관해서는 그다지 유용하지 않은 것으로 밝혀졌습니다.
Patrick

1

다음 코드 예제에서 a 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


-3

예, 딕셔너리에서 컬렉션 이니셜 라이저를 사용할 수 있습니다.

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" }  

            }; 

4
이를 수행하는 방법을 보여주는 다른 답변이 이미 6 개 있습니다. 우리는 같은 것을 보여주는 7 번째 대답이 필요하지 않습니다.
Servy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.