it-swarm.com.de

Alle möglichen Array-Initialisierungssyntaxen

Was sind alle Array-Initialisierungssyntax, die mit C # möglich sind?

568
Joshua Girard

Dies sind die aktuellen Deklarations- und Initialisierungsmethoden für ein einfaches Array.

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

Beachten Sie, dass andere Techniken zum Erhalten von Arrays vorhanden sind, wie z. B. die Erweiterungen von Linq ToArray() auf IEnumerable<T>.

Beachten Sie auch, dass in den obigen Deklarationen die ersten beiden den string[] auf der linken Seite durch var (C # 3+) ersetzen könnten, da die Informationen auf der rechten Seite ausreichen, um den richtigen Typ zu ermitteln. Die dritte Zeile muss wie angezeigt geschrieben werden, da die Syntax der Array-Initialisierung allein nicht ausreicht, um die Anforderungen des Compilers zu erfüllen. Der vierte könnte auch Inferenz verwenden. Wenn Sie also die ganze Kürze mögen, könnte das oben als geschrieben werden

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 
599
Anthony Pegram

Die Syntax der Array-Erstellung in C #, die Ausdrücke sind, sind:

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

Im ersten Fall kann die Größe ein beliebiger nicht negativer Integralwert sein, und die Array-Elemente werden mit den Standardwerten initialisiert.

Im zweiten Fall muss die Größe konstant sein und die Anzahl der Elemente muss übereinstimmen. Es muss eine implizite Konvertierung von den angegebenen Elementen in den angegebenen Array-Elementtyp erfolgen.

Im dritten Element müssen die Elemente implizit in den Elementtyp konvertierbar sein, und die Größe wird aus der Anzahl der angegebenen Elemente bestimmt.

Im vierten Element wird der Typ des Feldelements hergeleitet, indem der beste Typ aller gegebenen Elemente, die Typen aufweisen, falls vorhanden, berechnet wird. Alle Elemente müssen implizit in diesen Typ konvertierbar sein. Die Größe wird aus der Anzahl der Elemente bestimmt. Diese Syntax wurde in C # 3.0 eingeführt.

Es gibt auch eine Syntax, die nur in einer Deklaration verwendet werden darf:

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

Die Elemente müssen implizit in den Elementtyp konvertierbar sein. Die Größe wird aus der Anzahl der Elemente bestimmt.

es gibt keine All-in-One-Anleitung

Ich verweise Sie auf C # 4.0-Spezifikation, Abschnitt 7.6.10.4 "Array-Erstellungsausdrücke".

401
Eric Lippert

Nicht leere Arrays

  • 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 } Ist nicht kompilierbar. Verwenden Sie stattdessen int[] data5 = { 1, 2, 3 }.

Leere Arrays

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { } Und int[] data9 = new [] { } Sind nicht kompilierbar.

  • var data10 = { } Ist nicht kompilierbar. Verwenden Sie stattdessen int[] data11 = { }.

Als Argument einer Methode

Nur Ausdrücke, die mit dem Schlüsselwort var zugewiesen werden können, können als Argumente übergeben werden.

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) ist nicht kompilierbar
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) ist nicht kompilierbar
102
kiss my armpit
Enumerable.Repeat(String.Empty, count).ToArray()

Erzeugt ein Array leerer Zeichenfolgen, die sich wiederholt zählen. Für den Fall, dass Sie das Array mit dem gleichen, aber speziellen Standardelementwert initialisieren möchten. Vorsicht bei Referenztypen, alle Elemente verweisen auf dasselbe Objekt.

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

Wenn Sie ein festes Array von vorinitialisierten gleich (nicht -null oder anderen Elementen als default) Elementen initialisieren möchten, verwenden Sie Folgendes:

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

Nehmen Sie auch an this diskussion teil.

13
Shimmy

Beispiel zum Erstellen eines Arrays einer benutzerdefinierten Klasse

Unten ist die Klassendefinition.

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

So können Sie das Array initialisieren:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "[email protected]",
       language = "English"
    },
    new DummyUser{
       email = "[email protected]",
       language = "Spanish"
    }
};
11
Amol
int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;

oder

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

oder

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

und in mehrdimensionaler Anordnung

    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
user2613377

Wiederholen Sie dies ohne LINQ :

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
5
Nick Shalimov
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
2

Eine andere Möglichkeit, ein Array von Objekten zu erstellen und zu initialisieren. Dies ist ähnlich zu dem Beispiel, das @Amol oben geschrieben hat, nur dass hier Konstruktoren verwendet werden. Ein Hauch von Polymorphismus spritzte herein, ich konnte nicht widerstehen.

IUser[] userArray = new IUser[]
{
    new DummyUser("[email protected]", "Gibberish"),
    new SmartyUser("[email protected]", "Italian", "Engineer")
};

Klassen für Kontext:

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;
}
0
Nick Alexeev

Sie können auch dynamische Arrays erstellen, d. H. Sie können zuerst die Größe des Arrays vom Benutzer abfragen, bevor Sie es erstellen.

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
Pushpendra7974

Triviale Lösung mit Ausdrücken. Beachten Sie, dass Sie mit NewArrayInit nur ein eindimensionales Array erstellen können. 

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
unsafePtr