값으로 C # 사전을 초기화하는 올바른 방법은 무엇입니까?


513

다음 코드를 사용하여 C # 파일에서 사전을 만들고 있습니다.

private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT
        = new Dictionary<string, XlFileFormat>
        {
            {"csv", XlFileFormat.xlCSV},
            {"html", XlFileFormat.xlHtml}
        };

new오류 가있는 빨간색 선이 있습니다 .

기능 'collection initilializer'는 ISO-2 C # 언어 사양의 일부가 아니므로 사용할 수 없습니다.

아무도 여기서 무슨 일이 일어나고 있는지 설명 할 수 있습니까?

편집 : 좋아, .NET 버전 2를 사용하고있는 것으로 나타났습니다.


3
대상 프레임 워크 버전을 변경하거나 "오래된"초기화 방법을 사용하십시오.
Sebastian Ðymel 2016 년

어떤 맥락에서이 코드를 배치합니까? .cs비주얼 스튜디오에 의해 컴파일, 또는에 도착 파일 .cshtml? 당신 하는가 프로젝트 파일은이 languageVersion요소를 ?
CodeCaster 2016 년

답변:


826

간단한 .NET 4.0 콘솔 응용 프로그램에서이 문제를 재현 할 수 없습니다.

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
            { "key1", "value1" },
            { "key2", "value2" }
        };

        Console.ReadKey();
    }
}

간단한 콘솔 응용 프로그램에서 그것을 재현하려고 시도 할 수 있습니까? 초기화 구문을 지원하는 .NET 버전이 아닌 .NET 2.0 (지원하지 않는) 또는 클라이언트 프로파일 프레임 워크를 대상으로하는 것 같습니다.


11
문제는 OP가 사용하는 C # 버전이며, 개체 / 컬렉션 초기화는 C # 3.0까지 도입되지 않았습니다. 왜 이전에 작동하지 않았는 지에 대한 세부 사항은 이미 답변 되었습니다 .
제임스

@James-그대로 표시하도록 편집되었습니다.
Haney

사용중인 C # 버전을 확인하거나 변경하려면 어떻게합니까?
azrosen92

3
프로젝트의 속성은 프레임 워크의 대상 버전을 나타냅니다.
Haney

2
@James-그러나 예를 들어 2.0을 대상으로하고 있고 모르는 솔루션에서이 사람이 일부 레거시 작업을 집어 들었을 가능성이 있기 때문에 확실하지 않습니다.
Haney

198

C # 6.0을 사용하면 다음과 같은 방법으로 사전을 만들 수 있습니다.

var dict = new Dictionary<string, int>
{
    ["one"] = 1,
    ["two"] = 2,
    ["three"] = 3
};

사용자 정의 유형에서도 작동합니다.


8
이 새로운 구문에 더 관심이있는 사람들을 위해 여기에 좋은 블로그 게시물이 있습니다 : marcin-chwedczuk.github.io/…
csharpfolk

1
인라인 선언에 적합합니다.
Tiramonium

1
니스-이 초기화 방법을 몰랐습니다. 파이썬처럼 보입니다)) 감사합니다!
Mikhail T.

나는 당신의 방법을 더 좋아하지만 { "key2", "value2"},
Maxter

35

Dictionary(및 다른 컬렉션) 인라인을 초기화 할 수 있습니다 . 각 멤버는 중괄호로 구성됩니다.

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 을 참조하십시오.


21

우리가 이런 사전을 가지고 있다고 가정하자

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

ReSharper가 대답합니다.
Antony Booth

10

C # 3.0에서 개체 이니셜 라이저가 도입되었습니다. 타겟팅 할 프레임 워크 버전을 확인하십시오.

C # 3.0 개요


0

C # 6.0으로

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
           ["Key1"]="Value1",
           ["Key2"]="Value2"
        };

        Console.ReadKey();
    }
}

2
이것은 이미 답변되었습니다. 새로운 것을 추가하지 않습니다.
nawfal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.