태그 보관물: collections

collections

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

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

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

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

참고로 컬렉션 이니셜 라이저에는 기본적으로 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되어 있지만 완전성을 위해 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",
};

답변

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

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


답변

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


답변

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

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

            };