가능한 모든 배열 초기화 구문


답변:


779

간단한 배열에 대한 현재 선언 및 초기화 방법입니다.

string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2

Linq ToArray()확장 기능 과 같은 배열을 얻는 다른 기술이 IEnumerable<T>있습니다.

또한 위의 선언에서 첫 번째 두 개 string[]는 왼쪽의를 var(C # 3+)로 바꿀 수 있습니다. 오른쪽의 정보는 적절한 유형을 유추하기에 충분하기 때문입니다. 배열 초기화 구문만으로는 컴파일러의 요구를 충족시키기에 충분하지 않으므로 세 번째 행은 표시된대로 작성해야합니다. 네 번째는 추론을 사용할 수도 있습니다. 그래서 당신이 전체 간결한 것에 빠져 있다면, 위의 내용은 다음과 같이 쓸 수 있습니다.

var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2 

1
궁금한 점이 있다면 누군가 3 번째 줄의 초기화 표현식을 단독으로 사용하거나 (예 : 메소드에 전달) var변수에 할당 할 수없는 이유를 설명 할 수 있습니까?
Ruben9922

1
@ Ruben9922 : 흥미로운 질문입니다. var x = {}배열 이니셜 라이저가 배열 이외의 다른 것을 생성 할 수 있다면 작동하지 않는 것이 합리적 이지만 그것이 무엇인지 알 수는 없습니다. 그래서 배열 이니셜 라이저는 언어 기능이라고 생각합니다. 함께 사용하면 new List<string> {"A", "B"}다른 결과가 나옵니다.
TvdH

441

표현식 인 C #의 배열 작성 구문 은 다음과 같습니다.

new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }

첫 번째에서, 크기는 음이 아닌 정수 값일 수 있으며 배열 요소는 기본값으로 초기화됩니다.

두 번째 크기는 크기가 일정해야하며 주어진 요소 수가 일치해야합니다. 주어진 요소에서 주어진 배열 요소 유형으로의 암시 적 변환이 있어야합니다.

세 번째 요소에서 요소는 암시 적으로 요소 유형으로 변환 가능해야하며 크기는 주어진 요소 수에서 결정됩니다.

네 번째 요소에서 배열 요소의 유형은 유형이있는 모든 주어진 요소 중 최상의 유형 (있는 경우)을 계산하여 추론됩니다. 모든 요소는 해당 유형으로 암시 적으로 변환 가능해야합니다. 크기는 주어진 요소의 수에서 결정됩니다. 이 구문은 C # 3.0에서 도입되었습니다.

선언에만 사용할 수있는 구문도 있습니다.

int[] x = { 10, 20, 30 };

요소는 내재적으로 요소 유형으로 변환 가능해야합니다. 크기는 주어진 요소의 수에서 결정됩니다.

올인원 가이드가 없습니다

C # 4.0 사양 섹션 7.6.10.4 "배열 생성 표현식"을 참조합니다.


8
@BoltClock : 언급 한 첫 번째 구문은 "암시 적으로 형식화 된 배열 생성 식"입니다. 두 번째는 "익명 개체 생성 표현"입니다. 다른 두 가지 유사한 구문은 나열하지 않습니다. 그것들은 "객체 이니셜 라이저"와 "컬렉션 이니셜 라이저"입니다.
Eric Lippert

11
정확히 C # "구문"은 아니지만 (내 개인적인 마음에 드는)를 잊지 말자 Array.CreateInstance(typeof(int), 3)!
Jeffrey L Whitledge

17
@Jeffrey : 우리가 그 길을 가고 있다면 어리석기 시작합니다. 예, "1,2,3,4".split(',').
Brian

11
그런 다음 다차원 배열에 대한 존재 "중첩"표기법 좋아 new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };, 그래서에에 int[,,], int[,,,]...
Jeppe의 Stig 닐슨

6
@ Learning-Overthinker-Confused : 두 마리의 말이 있습니다. 어느 것이 더 빠른지 알고 싶습니다. (1) 말을 경주하거나, (2) 인터넷에서 자신이 생각하는 말을 본 적이없는 낯선 사람에게 물어보십시오. 당신의 말을 경주 . 어느 쪽이 더 "효율적인"지 알고 싶습니까? 먼저 효율성에 대한 측정 가능한 표준을 만듭니다. 효율성은 단가 당 생산되는 가치 이므로, 가치와 비용을 신중하게 정의하십시오. 그런 다음 코드를 양방향으로 작성하고 효율성을 측정하십시오. 임의의 낯선 사람에게 추측을 요구하지 않고 과학을 사용하여 과학적 질문에 답하십시오 .
Eric Lippert

111

비어 있지 않은 배열

  • var data0 = new int[3]

  • var data1 = new int[3] { 1, 2, 3 }

  • var data2 = new int[] { 1, 2, 3 }

  • var data3 = new[] { 1, 2, 3 }

  • var data4 = { 1, 2, 3 }컴파일 할 수 없습니다. int[] data5 = { 1, 2, 3 }대신 사용하십시오 .

빈 배열

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { }int[] data9 = new [] { }컴파일 가능한 없습니다.

  • var data10 = { }컴파일 할 수 없습니다. int[] data11 = { } 대신 사용하십시오 .

메소드의 인수로서

var키워드로 지정할 수있는 표현식 만 인수로 전달할 수 있습니다.

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) 컴파일 할 수 없다
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) 컴파일 할 수 없다

14
유효하지 않은 구문과 유효하지 않은 구문을보다 명확하게 분리하는 것이 좋습니다.
jpmc26

주어진 예제가 완료 되었습니까? 다른 경우가 있습니까?
Money Oriented Programmer 11

49
Enumerable.Repeat(String.Empty, count).ToArray()

'카운트'번 반복되는 빈 문자열 배열을 만듭니다. 동일하지만 특별한 기본 요소 값으로 배열을 초기화하려는 경우. 참조 유형에주의하여 모든 요소는 동일한 객체를 참조합니다.


5
예, var arr1 = Enumerable.Repeat(new object(), 10).ToArray();동일한 객체에 대한 10 개의 참조가 있습니다. 10 개의 고유 한 개체를 만들려면 사용 var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();하거나 유사 할 수 있습니다 .
Jeppe Stig Nielsen

20
var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};

이 구조를 어떻게 사용해야합니까? 사전과 같은가요?
R. Navega

1
@ R.Navega 그것은 일반적인 배열입니다 :)
grooveplex

17

사전 초기화 된 동일 (이 아닌 null또는 다른 default) 요소 의 고정 배열을 초기화 하려면 다음을 사용하십시오.

var array = Enumerable.Repeat(string.Empty, 37).ToArray();

또한 토론에 참여하십시오 .


13

사용자 정의 클래스의 배열을 만드는 예

아래는 클래스 정의입니다.

public class DummyUser
{
    public string email { get; set; }
    public string language { get; set; }
}

다음은 배열을 초기화하는 방법입니다.

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "abc.xyz@email.com",
       language = "English"
    },
    new DummyUser{
       email = "def@email.com",
       language = "Spanish"
    }
};


6
int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;

또는

string[] week = new string[] {"Sunday","Monday","Tuesday"};

또는

string[] array = { "Sunday" , "Monday" };

다차원 배열에서

    Dim i, j As Integer
    Dim strArr(1, 2) As String

    strArr(0, 0) = "First (0,0)"
    strArr(0, 1) = "Second (0,1)"

    strArr(1, 0) = "Third (1,0)"
    strArr(1, 1) = "Fourth (1,1)"

5
안녕하세요, 예제의 마지막 블록은 Visual Basic 인 것처럼 보이며 질문은 c # 예제를 요구합니다.
Alex KeySmith


2

객체 배열을 만들고 초기화하는 또 다른 방법입니다. 이것은 생성자를 사용한다는 점을 제외하고 @Amol이 위에 게시 한 예 와 비슷합니다 . 다형성이 뿌려져 저항 할 수 없었습니다.

IUser[] userArray = new IUser[]
{
    new DummyUser("abc@cde.edu", "Gibberish"),
    new SmartyUser("pga@lna.it", "Italian", "Engineer")
};

컨텍스트 클래스 :

interface IUser
{
    string EMail { get; }       // immutable, so get only an no set
    string Language { get; }
}

public class DummyUser : IUser
{
    public DummyUser(string email, string language)
    {
        m_email = email;
        m_language = language;
    }

    private string m_email;
    public string EMail
    {
        get { return m_email; }
    }

    private string m_language;
    public string Language
    {
        get { return m_language; }
    }
}

public class SmartyUser : IUser
{
    public SmartyUser(string email, string language, string occupation)
    {
        m_email = email;
        m_language = language;
        m_occupation = occupation;
    }

    private string m_email;
    public string EMail
    {
        get { return m_email; }
    }

    private string m_language;
    public string Language
    {
        get { return m_language; }
    }

    private string m_occupation;
}

1

아래 수업의 경우 :

public class Page
{

    private string data;

    public Page()
    {
    }

    public Page(string data)
    {
        this.Data = data;
    }

    public string Data
    {
        get
        {
            return this.data;
        }
        set
        {
            this.data = value;
        }
    }
}

위와 같은 객체의 배열을 아래와 같이 초기화 할 수 있습니다.

Pages = new Page[] { new Page("a string") };

도움이 되었기를 바랍니다.


0

동적 배열을 만들 수도 있습니다. 즉, 배열을 만들기 전에 먼저 사용자에게 배열의 크기를 물어볼 수 있습니다.

Console.Write("Enter size of array");
int n = Convert.ToInt16(Console.ReadLine());

int[] dynamicSizedArray= new int[n]; // Here we have created an array of size n
Console.WriteLine("Input Elements");
for(int i=0;i<n;i++)
{
     dynamicSizedArray[i] = Convert.ToInt32(Console.ReadLine());
}

Console.WriteLine("Elements of array are :");
foreach (int i in dynamicSizedArray)
{
    Console.WriteLine(i);
}
Console.ReadKey();

0

식이있는 사소한 솔루션. NewArrayInit를 사용하면 1 차원 배열 만 만들 수 있습니다.

NewArrayExpression expr = Expression.NewArrayInit(typeof(int), new[] { Expression.Constant(2), Expression.Constant(3) });
int[] array = Expression.Lambda<Func<int[]>>(expr).Compile()(); // compile and call callback

0

그냥 메모

다음과 같은 배열 :

string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };

다음으로 컴파일 됩니다.

string[] array = new string[2];
string[] array2 = new string[]
{
   "A",
   "B"
};
string[] array3 = new string[]
{
   "A",
   "B"
};
string[] array4 = new string[]
{
   "A",
   "B"
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.