Tutte le possibili sintassi di inizializzazione dell'array


Risposte:


779

Questi sono i metodi di dichiarazione e inizializzazione correnti per un array semplice.

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

Si noti che esistono altre tecniche per ottenere array, come ad esempio le ToArray()estensioni Linq IEnumerable<T>.

Si noti inoltre che nelle dichiarazioni sopra, i primi due potrebbero sostituire il string[]a sinistra con var(C # 3+), poiché le informazioni a destra sono sufficienti per inferire il tipo corretto. La terza riga deve essere scritta come visualizzata, poiché la sola sintassi di inizializzazione dell'array non è sufficiente per soddisfare le esigenze del compilatore. Il quarto potrebbe anche usare l'inferenza. Quindi, se ti interessa tutta la brevità, quanto sopra potrebbe essere scritto come

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
Per curiosità, qualcuno potrebbe spiegare perché l'espressione di inizializzazione nella terza riga non può essere utilizzata da sola (ad esempio, passata a un metodo) o assegnata a una varvariabile?
Ruben9922,

1
@ Ruben9922: domanda interessante. Avrebbe senso che var x = {}non funzionasse se l'inizializzatore di array potesse produrre nient'altro che array, ma non saprei di che si tratta. Quindi immagino che l'inizializzatore di array sia una funzione del linguaggio. Se lo usi con new List<string> {"A", "B"}esso produce anche qualcosa di diverso.
TvdH,

441

Le sintassi di creazione dell'array in C # che sono espressioni sono:

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

Nel primo, la dimensione può essere qualsiasi valore integrale non negativo e gli elementi dell'array sono inizializzati sui valori predefiniti.

Nel secondo, la dimensione deve essere una costante e il numero di elementi indicati deve corrispondere. Deve esserci una conversione implicita dagli elementi dati al tipo di elemento matrice specificato.

Nel terzo, gli elementi devono essere implicitamente convertibili nel tipo di elemento e la dimensione è determinata dal numero di elementi forniti.

Nel quarto il tipo dell'elemento array viene dedotto calcolando il tipo migliore, se ce n'è uno, di tutti gli elementi dati che hanno tipi. Tutti gli elementi devono essere implicitamente convertibili in quel tipo. La dimensione è determinata dal numero di elementi indicati. Questa sintassi è stata introdotta in C # 3.0.

Esiste anche una sintassi che può essere utilizzata solo in una dichiarazione:

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

Gli elementi devono essere implicitamente convertibili nel tipo di elemento. La dimensione è determinata dal numero di elementi indicati.

non esiste una guida all-in-one

Vi rimando alla specifica C # 4.0, sezione 7.6.10.4 "Espressioni di creazione di array".


8
@BoltClock: la prima sintassi menzionata è "un'espressione di creazione di array tipizzata in modo implicito". Il secondo è "un'espressione di creazione di oggetti anonima". Non si elencano le altre due sintassi simili; sono "inizializzatore di oggetti" e "inizializzatore di raccolta".
Eric Lippert,

11
Non esattamente "sintassi" C #, ma non dimentichiamoci (il mio preferito) Array.CreateInstance(typeof(int), 3)!
Jeffrey L Whitledge,

17
@Jeffrey: se stiamo percorrendo quella strada, inizia a diventare sciocco. Ad es "1,2,3,4".split(',').
Brian,

11
Poi per array multidimensionali, esistono notazioni "nested" piace new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };, e così via per int[,,], int[,,,]...
Jeppe Stig Nielsen

6
@ Learning-Overthinker-Confused: hai due cavalli. Desideri sapere quale è più veloce. (1) corri con i cavalli o (2) chiedi a uno sconosciuto su Internet che non ha mai visto i cavalli quale crede sia più veloce? Gara i tuoi cavalli . Vuoi sapere quale è più "efficiente"? Innanzitutto creare uno standard misurabile per l'efficienza; ricorda, l'efficienza è il valore prodotto per costo unitario , quindi definisci attentamente il tuo valore e il costo. Quindi scrivere il codice in entrambi i modi e misurarne l'efficienza. Usa la scienza per rispondere a domande scientifiche, non chiedendo a estranei casuali di indovinare.
Eric Lippert,

111

Matrici non vuote

  • 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 }non è compilabile. Usa int[] data5 = { 1, 2, 3 }invece.

Matrici vuote

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { } e int[] data9 = new [] { }non sono compilabili.

  • var data10 = { }non è compilabile. Usa int[] data11 = { } invece.

Come argomento di un metodo

Solo le espressioni che possono essere assegnate con la varparola chiave possono essere passate come argomenti.

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) non è compilabile
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) non è compilabile

14
Sarebbe bene separare più chiaramente le sintassi non valide da quelle valide.
jpmc26,

Gli esempi forniti sono completi? C'è qualche altro caso?
Programmatore orientato al denaro

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

Creerà una serie di stringhe vuote ripetute 'count' volte. Nel caso in cui si desideri inizializzare l'array con lo stesso valore di elemento predefinito ma speciale. Attento ai tipi di riferimento, tutti gli elementi faranno riferimento allo stesso oggetto.


5
Sì, var arr1 = Enumerable.Repeat(new object(), 10).ToArray();ottieni 10 riferimenti allo stesso oggetto. Per creare 10 oggetti distinti, è possibile utilizzare var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();o simili.
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" }
    }
};

Come dovresti usare questa struttura? È come un dizionario?
R. Navega,

1
@ R.Navega è un array ordinario :)
grooveplex

17

Nel caso in cui si desideri inizializzare una matrice fissa di elementi uguali (non nullo diversi da default) pre-inizializzati , utilizzare questo:

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

Inoltre, prendi parte a questa discussione.


13

Esempio per creare una matrice di una classe personalizzata

Di seguito è la definizione della classe.

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

Ecco come è possibile inizializzare l'array:

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;

o

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

o

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

e in array multidimensionale

    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
Ciao, l'ultimo blocco di esempi sembra essere Visual Basic, la domanda richiede esempi di c #.
Alex KeySmith

4
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };

2

Un altro modo di creare e inizializzare una matrice di oggetti. Questo è simile all'esempio che @Amol ha pubblicato sopra , tranne che per i costruttori. Una spruzzata di polimorfismo spruzzò dentro, non potei resistere.

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

Classi per contesto:

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

Per la classe seguente:

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

è possibile inizializzare l'array dell'oggetto sopra come di seguito.

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

Spero che sia di aiuto.


0

È inoltre possibile creare matrici dinamiche, ovvero è possibile chiedere all'utente la dimensione della matrice prima di crearla.

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

Soluzione fondamentale con espressioni. Si noti che con NewArrayInit è possibile creare solo array monodimensionali.

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

Solo una nota

I seguenti array:

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

Sarà compilato per:

string[] array = new string[2];
string[] array2 = new string[]
{
   "A",
   "B"
};
string[] array3 = new string[]
{
   "A",
   "B"
};
string[] array4 = new string[]
{
   "A",
   "B"
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.