Bir C # dizisine değer ekleme


511

Muhtemelen gerçekten basit bir tane - C # ile başlıyorum ve örneğin bir diziye değerler eklemeliyim:

int[] terms;

for(int runs = 0; runs < 400; runs++)
{
    terms[] = runs;
}

PHP kullanmış olanlar için, ben C # yapmaya çalışıyorum:

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}

10
"Terms [] = değer;" 'terms [] = çalışır;'?
timtam

C # 'da oluşturulduktan sonra dizi boyutunu değiştiremezsiniz. Diziler gibi bir şey istiyorsanız ancak öğe ekleyip kaldırabiliyorsanız, Liste <int> () kullanın.
Kamran Bigdely

Yanıtlar:


822

Bu şekilde yapabilirsiniz -

int[] terms = new int[400];
for (int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Alternatif olarak Listeler'i kullanabilirsiniz - listelerin avantajı, listeyi başlatırken dizi boyutunu bilmenize gerek yoktur.

List<int> termsList = new List<int>();
for (int runs = 0; runs < 400; runs++)
{
    termsList.Add(value);
}

// You can convert it back to an array if you would like to
int[] terms = termsList.ToArray();

Düzenleme: a) için List <T> üzerinde döngüler 2'den kat daha ucuz biraz daha vardır foreach List <T> halkalara b) dizi döngü etrafında List <T> c) ile ilgili döngü daha 2 kat daha ucuz loop for kullanarak dizisi , foreach kullanarak (çoğumuz yapar) <T> Listesinde döngü yapmaktan 5 kat daha ucuzdur .


1
Bu senaryoda bir liste kullanmanın avantajı nedir?
Phill Healey

9
@PhillHealey Diziyi oluşturmadan önce ne kadar büyük olabileceğini "bilmek" zorunda değilsiniz. Gördüğünüz gibi, bu örneklerde OP “new int [400]” e bir değer katmak zorundadır - ancak listeyle bunu yapmak zorunda değildir.
Hejner

3
Değer hiçbir yerde tanımlanmadığı için kodun ilk biti hiçbir şey olmaz. -_-
EasyBB

1
Neden ARRAY'in bir boyuta ihtiyacı olduğunu söylüyorsun ??? sadece yap new int[]{}!!!!!
T.Todua

6
@ T.Todua, önerdiğiniz gibi boş bir dizi oluşturursanız ve ardından değerleri ayarlamak için var olmayan dizinlerine erişmeye çalışırsanız OutOfRangeException, kodu çalıştırır çalıştırmaz bir an alırsınız . Diziler, kullanacağınız boyutla başlatılmalıdır, başlangıçta tüm alanı ayırırlar, cadı onları çok hızlı yapar, ancak yeniden boyutlandırılması mümkün değildir.
KinSlayerUY

85

C # 3'te yazıyorsanız, bunu bir astarla yapabilirsiniz:

int[] terms = Enumerable.Range(0, 400).ToArray();

Bu kod snippet'i, dosyanızın üst kısmında System.Linq için bir kullanım yönergesine sahip olduğunuzu varsayar.

Öte yandan, dinamik olarak yeniden boyutlandırılabilecek bir şey arıyorsanız, göründüğü gibi PHP (gerçekte hiç öğrenmedim) için geçerliyse, int [] yerine bir Liste kullanmak isteyebilirsiniz . İşte bu kod şöyle görünecektir:

List<int> terms = Enumerable.Range(0, 400).ToList();

Bununla birlikte, bir değere terimler [400] ayarlayarak yalnızca 401. bir öğeyi ekleyemeyeceğinizi unutmayın. Bunun yerine Add () öğesini çağırmanız gerekir, şöyle:

terms.Add(1337);

65

Kullanılması Linq bireyin yöntemi Concat bu BASİTLEŞTİRİYOR

int[] array = new int[] { 3, 4 };

array = array.Concat(new int[] { 2 }).ToArray();

sonuç 3,4,2


12
Yöntem, diziye 400 öğe eklemenin, bir boşluk daha içeren dizinin bir kopyasını oluşturmasını ve tüm öğeleri 400 yüz kez yeni diziye taşımasını sağlar. performans akıllıca tavsiye edilmez.
KinSlayerUY

39

Bir dizi kullanarak nasıl yapılacağı ile ilgili cevaplar burada verilmiştir.

Ancak, C # System.Collections adlı çok kullanışlı bir şey var :)

Koleksiyonlar bir dizi kullanmaya süslü alternatiflerdir, ancak birçoğu dahili olarak bir dizi kullanır.

Örneğin, C #, PHP dizisine çok benzeyen Liste adlı bir koleksiyona sahiptir.

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

bir liste öğesini almak için: int a = list [i];
Behzad

10

Bir Listeyi aracı olarak kullanmak, diğerlerinin açıkladığı gibi en kolay yoldur, ancak girdiniz bir dizi olduğundan ve verileri yalnızca bir Listede tutmak istemediğinizden, performansla ilgili endişeleriniz olabileceğini düşünüyorum.

En etkili yöntem muhtemelen yeni bir dizi ayırmak ve sonra Array.Copy veya Array.CopyTo kullanmaktır. Listenin sonuna bir öğe eklemek istiyorsanız bu zor değildir:

public static T[] Add<T>(this T[] target, T item)
{
    if (target == null)
    {
        //TODO: Return null or throw ArgumentNullException;
    }
    T[] result = new T[target.Length + 1];
    target.CopyTo(result, 0);
    result[target.Length] = item;
    return result;
}

İsterseniz, hedef dizini girdi olarak alan bir Insert uzantısı yöntemi için de kod gönderebilirim. Biraz daha karmaşıktır ve Array.Copy statik yöntemini 1-2 kez kullanır.


2
Bir liste oluşturmak, doldurmak ve daha sonra bu kopyayı sonunda diziye yapmak çok daha iyi, performans açısından akıllıca olacaktır, bu nedenle diziyi 400 defadan fazla oluşturup kopyalamıyorsunuz
KinSlayerUY

10

Thracx'ın cevabına dayanarak (cevaplamak için yeterli puanım yok):

public static T[] Add<T>(this T[] target, params T[] items)
    {
        // Validate the parameters
        if (target == null) {
            target = new T[] { };
        }
        if (items== null) {
            items = new T[] { };
        }

        // Join the arrays
        T[] result = new T[target.Length + items.Length];
        target.CopyTo(result, 0);
        items.CopyTo(result, target.Length);
        return result;
    }

Bu, diziye yalnızca birden fazla öğe eklenmesine veya iki diziyi birleştirmek için parametre olarak bir dizi iletilmesine izin verir.


8

Önce diziyi ayırmanız gerekir:

int [] terms = new int[400]; // allocate an array of 400 ints
for(int runs = 0; runs < terms.Length; runs++) // Use Length property rather than the 400 magic number again
{
    terms[runs] = value;
}

5
int ArraySize = 400;

int[] terms = new int[ArraySize];


for(int runs = 0; runs < ArraySize; runs++)
{

    terms[runs] = runs;

}

Ben böyle kodlayacağım.


3

C # dizileri sabit uzunluktadır ve her zaman dizine eklenir. Motti'nin çözümüyle gidin:

int [] terms = new int[400];
for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Bu dizinin yoğun bir dizi olduğunu, şeyleri bırakabileceğiniz 400 baytlık bitişik bir blok olduğunu unutmayın. Dinamik olarak boyutlandırılmış bir dizi istiyorsanız, bir Liste <int> kullanın.

List<int> terms = new List<int>();
for(int runs = 0; runs < 400; runs ++)
{
    terms.Add(runs);
}

Ne int [] ne de Liste <int> ilişkilendirilebilir bir dizidir - bu C # 'da Sözlük <> olur. Hem diziler hem de listeler yoğundur.


2
int[] terms = new int[10]; //create 10 empty index in array terms

//fill value = 400 for every index (run) in the array
//terms.Length is the total length of the array, it is equal to 10 in this case 
for (int run = 0; run < terms.Length; run++) 
{
    terms[run] = 400;
}

//print value from each of the index
for (int run = 0; run < terms.Length; run++)
{
    Console.WriteLine("Value in index {0}:\t{1}",run, terms[run]);
}

Console.ReadLine();

/*Çıktı:

400: indeksi 0 değeri,
400: endeksi 1 değer
400: endeksi 2 Değer
: 400 endeksi 3 Değer
: 400 endeksi 4 Değer
: 400 dizin 5 değeri
400: endeksi 6 Değer
: 400 dizin 7'de değer
değer olarak dizin 8: 400
Endeks 9: 400
* içindeki değer /


Bu çözümü açıklayabilir misiniz?
Derin Dondurulmuş

Rune, yorumu kaynak kodun içine ekledim> Umarım sorunuzu cevaplayabilir.
jhyap

2

Bir diziye kolayca bir eleman ekleyemezsiniz. Öğeyi belirli bir konumda belirtilen fallen888 olarak ayarlayabilirsiniz , ancak bunun yerine a List<int>veya a Collection<int>kullanmanızı ve ToArray()diziye dönüştürülmeniz gerekiyorsa kullanmanızı öneririm .


2

Gerçekten bir diziye ihtiyacınız varsa aşağıdakiler muhtemelen en basit olanıdır:

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

int [] terms = list.ToArray();

2

Bunu başka bir varyant için ekleyeceğim. Bu tip fonksiyonel kodlama hatlarını daha çok tercih ediyorum.

Enumerable.Range(0, 400).Select(x => x).ToArray();

1

Dizinin boyutunu bilmiyorsanız veya zaten eklediğiniz mevcut bir diziniz varsa. Bunu iki şekilde yapabilirsiniz. Birincisi jenerik kullanmaktır List<T>: Bunu yapmak için diziyi a dönüştürmek var termsList = terms.ToList();ve Add yöntemini kullanmak istersiniz . Sonra bittiğinde var terms = termsList.ToArray();bir diziye geri dönüştürmek için yöntemi kullanın.

var terms = default(int[]);
var termsList = terms == null ? new List<int>() : terms.ToList();

for(var i = 0; i < 400; i++)
    termsList.Add(i);

terms = termsList.ToArray();

İkinci yol, geçerli diziyi yeniden boyutlandırmaktır:

var terms = default(int[]);

for(var i = 0; i < 400; i++)
{
    if(terms == null)
        terms = new int[1];
    else    
        Array.Resize<int>(ref terms, terms.Length + 1);

    terms[terms.Length - 1] = i;
}

.NET 3.5 kullanıyorsanız Array.Add(...);

Bunların her ikisi de dinamik olarak yapmanıza izin verecektir. Çok sayıda öğe ekleyecekseniz sadece a kullanın List<T>. Sadece birkaç öğe varsa, diziyi yeniden boyutlandırmak daha iyi performansa sahip olacaktır. Bunun nedeni, List<T>nesneyi oluşturmak için daha fazla isabet almanızdır.

Times keneler içinde:

3 öğe

Dizi Yeniden Boyutlandırma Süresi: 6

Liste Ekleme Süresi: 16

400 öğe

Dizi Yeniden Boyutlandırma Süresi: 305

Liste Ekleme Süresi: 20


1

Sadece farklı bir yaklaşım:

int runs = 0; 
bool batting = true; 
string scorecard;

while (batting = runs < 400)
    scorecard += "!" + runs++;

return scorecard.Split("!");

3
Biraz yeni olsa da, bu çok fazla dize birleştirmesi gerçekleştiriyor ve daha sonra büyük bir numaralandırma işlemi gerçekleştiriyor! Bunu yapmanın en performanslı veya kolay anlaşılabilir / okunabilir yolu değil.
BradleyDotNET

@Ali Humayun gerçekten =karşılaştırma operatörü yerine atama operatörünü kullanmayı düşündünüz mü ? Savaş değişkenini dışarıda bırakabilir runs < 400ve döngüyü kontrol etmek için kullanabilirsiniz .
Steve

sadece çift giriş programlama programlama
Ali Humayun

1

bir yaklaşım, bir diziyi LINQ ile doldurmaktır

bir diziyi tek bir öğe ile doldurmak istiyorsanız,

string[] arrayToBeFilled;
arrayToBeFilled= arrayToBeFilled.Append("str").ToArray();

Ayrıca, bir diziyi birden çok öğeyle doldurmak istiyorsanız, önceki kodu bir döngüde kullanabilirsiniz

//the array you want to fill values in
string[] arrayToBeFilled;
//list of values that you want to fill inside an array
List<string> listToFill = new List<string> { "a1", "a2", "a3" };
//looping through list to start filling the array

foreach (string str in listToFill){
// here are the LINQ extensions
arrayToBeFilled= arrayToBeFilled.Append(str).ToArray();
}

0
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

0
         static void Main(string[] args)
        {
            int[] arrayname = new int[5];/*arrayname is an array of 5 integer [5] mean in array [0],[1],[2],[3],[4],[5] because array starts with zero*/
            int i, j;


          /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

             /*output each array element value*/
            for (j = 0; j < 5; j++)
            {
                Console.WriteLine("Element and output value [{0}]={1}",j,arrayname[j]);
            }
            Console.ReadKey();/*Obtains the next character or function key pressed by the user.
                                The pressed key is displayed in the console window.*/
        }

0
            /*arrayname is an array of 5 integer*/
            int[] arrayname = new int[5];
            int i, j;
            /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

0

ToArray () yöntemini kullanmadan C # kullanarak liste değerlerini dize dizisine eklemek için

        List<string> list = new List<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");
        list.Add("four");
        list.Add("five");
        string[] values = new string[list.Count];//assigning the count for array
        for(int i=0;i<list.Count;i++)
        {
            values[i] = list[i].ToString();
        }

Değer dizisinin çıktısı şunları içerir:

bir

iki

üç

dört

beş

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.