Soru C # içindeki boş bir diziyi nasıl başlatırım?


Boyutu belirtmeden boş bir dizi oluşturmak mümkün mü?

Örneğin, ben oluşturdum:

String[] a = new String[5];

Yukarıdaki dize dizisini, boyutsuz oluşturabilir miyiz?


220
2018-01-04 12:49


Menşei


stackoverflow.com/questions/151936/... Bu bağlantıyı kontrol edin, dizi olaylarını net bir şekilde anlamanıza yardımcı olabilir - Ravi Gadag
Ayrıca bkz. her olası-c-sivri dizi-başlatma-sözdizimi - nawfal
Integers hakkında ne dersiniz? - JoshYates1980


Cevaplar:


Önceden boyutunu bilmediğiniz bir koleksiyonu kullanacaksanız, dizilerden daha iyi seçenekler vardır.

Kullanın List<string> bunun yerine, ihtiyacınız olduğu kadar çok öğe eklemenize izin verir ve bir dizi döndürmeniz gerekirse, ToArray() değişken üzerinde.

var listOfStrings = new List<string>();

// do stuff...

string[] arrayOfStrings = listOfStrings.ToArray();

Eğer sen şart boş bir dizi oluşturmak için bunu yapabilirsiniz:

string[] emptyStringArray = new string[0]; 

315
2018-01-04 12:51



@Oded - string [] emptyStringArray = yeni dize [0]; boş bir diziyle sonuçlanmaz, değil mi? Bu elemanın null olduğu tek elemanlı bir dizi gibi görünüyor. - rory.ap
@roryap - Hayır. Sonuç olarak string[] hiçbir unsuru yoktur. Eğer erişmeye çalışırsan emptyStringArray[0], sen bir IndexOutOfRangeException - Oded
@Oded - Teşekkürler, C # için oldukça yeni. VB'de, sağlanan dizin, elemanların sayısı değil, üst sınırdır. - rory.ap
Daha iyi ne düşünürdünüz: var dizeleri = new string [] {}; veya var dizeleri = new string [0]; BTW: Ben boş bir dizi yöntem parametreleri için mükemmel geçerli bir varsayılan düşünün: public void EditItems (IEnumerable <Item> toEdit, IEnumerable <long> toDelete = yeni uzun [] {}) - realbart
@ RickO'Shea - C ++ C # değil. Stroustrup C ++'sını biliyor - C # ve .NET GC'yi bildiğinden emin değil. Seninle dini savaşa girmeyeceğim. - Oded


Bunu dene:

string[] a= new string[] { };

136
2018-01-04 12:56



Bu cevabı genişleterek, diziyi OR türünü belirtmeden öğelerle de başlatabilirsiniz; derleyici, başlatıcıdan çıkar: var a = new [] {"a", "b", "c"}; Bu, hala yazılan bir dize dizisidir. - Nick VanderPyle
İşlenmeyen Özel Durum: System.IndexOutOfRangeException: Dizin, dizinin boun ds dışındaydı. ArrayClass.Main (String [] args) 'da. İnt [] variable = new int [] {} değiştirdikten sonra bu hatayı yaşadım - yogesh
@yogesh: Bu garip. Örneğin yazarken int[] variable = new int[]{} ve örneğin örneğin bir döngüde kullanmak foreach (var s in variable){ Console.WriteLine(s);} kod derlenir: int[] args1 = new int[0]; ve foreach (int num in args1){Console.WriteLine(num);}. Yani kullanım arasında fark olmamalı new int[0] ve new int[]{} her ikisi de aynı koda derlenmiş olarak. - Nope
@NickVanderPyle evet, ama boş bir dizi için, bu işe yaramaz. - nawfal
@GlennGordon Kesinlikle, ama bu C # sürüm 3.0 (2007'den itibaren, Visual Studio 2008 ile) olarak yeni. Bu sürüm ayrıca başka bir basit formata izin verir varSadece yerel değişkenler için olsa da (alanlar için değil). Ancak C # 2.0 (Visual Studio 2005) ve daha önce, bu cevabın sözdizimini kullanmak zorundaydınız (veya string[] a = new string[0];). - Jeppe Stig Nielsen


.Net 4.6'da tercih edilen yol yeni bir yöntem kullanmaktır. Array.Empty:

String[] a = Array.Empty<string>();

uygulama kısaca Genel sınıflardaki statik üyelerin nasıl davranır. Net:

public static T[] Empty<T>()
{
    return EmptyArray<T>.Value;
}

// Useful in number of places that return an empty byte array to avoid
// unnecessary memory allocation.
internal static class EmptyArray<T>
{
    public static readonly T[] Value = new T[0];
}

(kod anlaşması ile ilgili kod açıklık için kaldırıldı)

Ayrıca bakınız:


60
2017-11-04 06:47



@Cole Johnson - Düzenleme için teşekkürler, ama geri aldım. Bu satırları amaca göre ihmal ettim: Sadece ilginç uygulamaları alıntılamak istedim. Kod sözleşmesi ve nitelikler sadece neler olup bittiğini anlama yolunda ilerler (kaynağa olan bağlantı elbette her şeye sahiptir). Yığın Taşması üzerinde kaymamak için yorumda bir satır ekledim. Eğer sakıncası yoksa, bunu tercih ederim. Teşekkürler! - Kobi


Boyutu 0 olarak başlatabilir, ancak diziye eklenemediğinden boyutun ne olduğunu bildiğinizde yeniden başlatmanız gerekir.

string[] a = new string[0];

27
2018-01-04 12:51





Boyutsuz bir dizinin bildirilmesinde fazla bir nokta yoktur. Bir dizi boyutu hakkında. Belirli bir boyut dizisini bildirdiğinizde, bir koleksiyonda bulunan ve sabit tutulabilen bir koleksiyonda bulunan sabit yuva sayısını belirtirsiniz ve buna göre bellek ayrılır. Buna bir şey eklemek için, var olan diziyi yeniden sıfırlamanız gerekir (diziyi yeniden boyutlandırıyor olsanız bile, bu konuya bakın). Boş bir diziyi başlatmak istediğiniz nadir durumlardan biri diziyi argüman olarak iletmek olacaktır.

Bir koleksiyonun büyüklüğünü, hangi boyutta olabileceğini bilmediğinizde tanımlamak istiyorsanız, dizi sizin seçiminiz değildir, ancak List<T> veya benzeri.

Diyelim ki, belirtmeksizin bir dizi bildirmek için tek yol boş bir diziye sahip olmaktır. boyut 0. hemant ve Alex Dn iki yol sağlar. Başka bir basit alternatif sadece:

string[] a = { };

[Braketin içindeki elemanlar, örtülü olarak türden tanımlı olabilir, örneğin, string[] a = { "a", "b" };]

Ya da başka bir:

var a = Enumerable.Empty<string>().ToArray();

İşte daha açıklayıcı bir yol:

public static class Array<T>
{
    public static T[] Empty()
    {
        return Empty(0);
    }

    public static T[] Empty(int size)
    {
        return new T[size];
    }
}

Şimdi arayabilirsin:

var a = Array<string>.Empty();

//or

var a = Array<string>.Empty(5);

6
2017-09-03 15:21



Boş bir diziyi döndürmenin anlam ifade ettiği birçok kullanım durumu var ... - Ignacio Soler Garcia
Bir diziyi parametre olarak geçirmeniz dışında herhangi bir kullanım düşünemiyorum. Yöntemin bir dizi nesne kabul ettiği ve varsayılan eylemi gerçekleştirmek için boş bir diziyi iletmek isteyebileceğiniz yansımalarda birkaç durum vardır. Cevabımı düzenleyeceğim. - nawfal
Örneğin, bir IEnumerable döndüren çeşitli sınıflar tarafından uygulanan bir arabirime sahipsiniz ve uygulamalardan biri, yöntem için öğelere sahip değildir ve örneğin boş bir dizi döndürür. - Ignacio Soler Garcia
@IgnacioSolerGarcia Bu durumda bir dizi ve sadece son derece performanslı bir kritik uygulama ise bir dizi döndürürdüm. Dizilerin modası geçmiş olduğunu ve yapabiliyorsanız kaçınmanız gerektiğini söyleyeceğim. Görmek bu Lippert tarafından ve Bu yüzden. soru - nawfal
Boş bir dizi için kullanım durumu basittir - nesneleri ile doldurmak istediğinizde ve kaç tane ekleyeceğinizi bilmiyorsunuz! - vapcguy


Yapabilirsin:

string[] a = { String.Empty };

Not: OP, bir diziyi belirtmek değil, bir diziyi belirtmek zorunda değildi. boyutsuz


3
2018-05-08 03:12



Bu, 1'lik bir dizi dizi oluşturmaz mı? - Sumner Evans
Doğru, ama temizlendi. Ve OP, bir büyüklüğü belirtmek zorunda kalmadan diziyi bildirmeyi istedi - buna uyar. - vapcguy
Ve bu bir düşüşü hak ediyor, neden? OP yapmak zorunda değildi specify bir boyut değil, bir dizi yapmayın sizeless. - vapcguy
Reddetmedim. Cevabınıza biraz daha açıklama eklerseniz, bazı yükseltmeler alabilirsiniz (veya en azından daha az kısaltılmış olsun). - Sumner Evans
@vapcguy Ben downvoter oldu. Pişmanım. Red cevabımı iptal etmek için cevabınızı düzenledim. Yorumunuz, soruyu biraz şüpheli hale getiriyor. OP'nin ne anlama geldiğinden emin değil. - nawfal


Çalışma zamanında dizi boyutunu tanımlayabilirsiniz.

Bu, dizinin boyutunu dinamik olarak hesaplamak için her şeyi yapmanıza izin verecektir. Ancak, bir kez tanımlandığında, boyut değişmezdir.

Array a = Array.CreateInstance(typeof(string), 5);

2
2018-01-04 14:29



Neden hepsi bu kadar? Çalışma zamanında dizi büyüklüğünü normalden bir değişkenden tanımlayabilirsiniz: int i = 5; string[] a = new string[i]; - Kevin Brock
Eh, sanırım jenerik ile bu eskimiş gibi görünüyor. - radarbob


Bildiğim kadarıyla boyut yapmadan dizi yapamazsınız, ancak kullanabilirsiniz

List<string> l = new List<string>() 

ve sonra l.ToArray().


1
2018-01-04 12:54