Dodawanie wartości do tablicy C #

510

Prawdopodobnie to bardzo proste - zaczynam od C # i muszę dodać wartości do tablicy, na przykład:

int[] terms;

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

Dla tych, którzy używali PHP, oto co próbuję zrobić w C #:

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}
Ross
źródło
10
Nie powinien „warunki [] = wartość;” być „warunki [] = biegnie;”?
tymtam
W języku C # nie można zmienić rozmiaru tablicy po utworzeniu. Jeśli chcesz czegoś takiego jak tablice, ale możesz dodawać / usuwać elementy, użyj List <int> ().
Kamran Bigdely

Odpowiedzi:

821

Możesz to zrobić w ten sposób -

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

Alternatywnie można użyć list - zaletą list jest to, że nie trzeba znać rozmiaru tablicy podczas tworzenia listy.

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();

Edycja: a) dla pętli na liście <T> są nieco ponad 2 razy tańsze niż dla pętli foreach na liście <T>, b) zapętlanie na tablicy jest około 2 razy tańsze niż zapętlenie na liście <T>, c) zapętlenie na tablica używająca for jest 5 razy tańsza niż zapętlanie listy <T> przy użyciu foreach (co większość z nas robi).

Tamas Czinege
źródło
1
Jaka jest zaleta korzystania z listy w tym scenariuszu?
Phill Healey
9
@PhillHealey Nie musisz „wiedzieć”, jak duża może być tablica, zanim ją utworzysz. Jak widać, w tych przykładach OP musi wstawić wartość do „new int [400]” - ale z listą nie musi tego robić.
Hejner
3
Czy pierwszy bit kodu nie byłby niczym, ponieważ wartość nie jest nigdzie zdefiniowana. -_-
EasyBB
1
Dlaczego mówisz, że tablica musi mieć rozmiar? po prostu zrób new int[]{}!!!!!
T.Todua,
6
@ T.Todua, jeśli utworzysz pustą tablicę, jak sugerujesz, a następnie spróbujesz uzyskać dostęp do jej nieistniejących indeksów w celu ustawienia wartości, otrzymasz OutOfRangeExceptionnatychmiast po uruchomieniu kodu. Tablice muszą być inicjowane rozmiarem, którego zamierzasz użyć, rezerwują całą przestrzeń na początku, co czyni je bardzo szybkimi, ale nie można ich zmienić.
KinSlayerUY
85

Jeśli piszesz w C # 3, możesz to zrobić za pomocą jednej linijki:

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

W tym fragmencie kodu założono, że na początku pliku znajduje się dyrektywa w sprawie użycia System.Linq.

Z drugiej strony, jeśli szukasz czegoś, co można dynamicznie zmieniać, jak to wygląda w przypadku PHP (nigdy tak naprawdę się tego nie nauczyłem), możesz użyć Listy zamiast int [] . Oto jak wyglądałby ten kod:

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

Należy jednak pamiętać, że nie można po prostu dodać 401-go elementu poprzez ustawienie warunków [400] na wartość. Zamiast tego musisz wywołać Add () w następujący sposób:

terms.Add(1337);
David Mitchell
źródło
65

Zastosowanie metody Linq Concat upraszcza to

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

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

wynik 3,4,2

Yitzhak Weinberg
źródło
12
Metoda sprawi, że dodanie 400 elementów do tablicy utworzy kopię tablicy z jeszcze jedną przestrzenią i przeniesienie wszystkich elementów do nowej tablicy, 400 razy. więc nie jest zalecane pod względem wydajności.
KinSlayerUY
39

Odpowiedzi na temat tego, jak to zrobić za pomocą tablicy, znajdują się tutaj.

Jednak C # ma bardzo przydatną funkcję o nazwie System.Collections :)

Kolekcje są fantazyjną alternatywą dla używania tablicy, chociaż wiele z nich używa tablicy wewnętrznie.

Na przykład C # ma kolekcję o nazwie List, która działa bardzo podobnie do tablicy PHP.

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);
}
FlySwat
źródło
do pobierania elementu listy: int a = list [i];
Behzad
10

Używanie Listy jako pośrednika jest najłatwiejszym sposobem, jak to opisali inni, ale ponieważ twoje dane wejściowe są tablicą i nie chcesz po prostu przechowywać danych na Liście, przypuszczam, że możesz martwić się wydajnością.

Najbardziej wydajną metodą jest prawdopodobnie przydzielenie nowej tablicy, a następnie użycie Array.Copy lub Array.CopyTo. Nie jest to trudne, jeśli chcesz tylko dodać element na końcu listy:

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

W razie potrzeby mogę także kod pocztowy dla metody rozszerzenia Wstaw, która przyjmuje indeks docelowy jako dane wejściowe. Jest to trochę bardziej skomplikowane i wykorzystuje statyczną metodę Array.Copy 1-2 razy.

Thracx
źródło
2
Byłoby znacznie lepiej, pod względem wydajności, utworzyć listę, wypełnić ją, a następnie wykonać kopię do tablicy na końcu, aby nie tworzyć i kopiować tablicy ponad 400 razy
KinSlayerUY
10

Na podstawie odpowiedzi Thracx (nie mam wystarczającej liczby punktów, aby odpowiedzieć):

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

Pozwala to dodać więcej niż jeden element do tablicy lub po prostu przekazać tablicę jako parametr, aby połączyć dwie tablice.

znak
źródło
8

Najpierw musisz przydzielić tablicę:

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;
}
Motti
źródło
5
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

Tak by to napisałam.

JB King
źródło
3

Tablice C # mają stałą długość i zawsze są indeksowane. Idź z rozwiązaniem Motti:

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

Zauważ, że ta tablica jest gęstą tablicą, ciągłym blokiem o długości 400 bajtów, w którym można upuścić rzeczy. Jeśli chcesz mieć tablicę o dynamicznym rozmiarze, użyj List <int>.

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

Ani int [], ani List <int> nie jest tablicą asocjacyjną - byłby to Słownik <> w języku C #. Zarówno tablice, jak i listy są gęste.

Jimmy
źródło
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();

/*Wynik:

Wartość w indeksie 0: 400
Wartość w indeksie 1: 400
Wartość w indeksie 2: 400
Wartość w indeksie 3: 400
Wartość w indeksie 4: 400
Wartość w indeksie 5: 400
Wartość w indeksie 6: 400
Wartość w indeksie 7: 400
Wartość w indeks 8: 400
Wartość w indeksie 9: 400
* /

jhyap
źródło
Czy możesz wyjaśnić to rozwiązanie?
Deep Frozen
Rune, właśnie umieściłem komentarz w kodzie źródłowym> Mam nadzieję, że może odpowiedzieć na twoje pytanie.
jhyap
2

Nie można po prostu łatwo dodać elementu do tablicy. Możesz ustawić element w danej pozycji jako nakreślony fallen888 , ale zalecam użycie a List<int>lub Collection<int>a, i użyj, ToArray()jeśli potrzebujesz go przekonwertować na tablicę.

Michael Stum
źródło
2

Jeśli naprawdę potrzebujesz tablicy, to prawdopodobnie jest najprostsza:

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();
Steve
źródło
2

Dodam to dla innego wariantu. Wolę bardziej tego rodzaju funkcjonalne linie kodujące.

Enumerable.Range(0, 400).Select(x => x).ToArray();
David
źródło
1

Jeśli nie znasz rozmiaru tablicy lub masz już istniejącą tablicę, do której dodajesz. Możesz to zrobić na dwa sposoby. Pierwszym jest użycie ogólnego List<T>: Aby to zrobić, musisz przekonwertować tablicę na a var termsList = terms.ToList();i użyć metody Add. Następnie po zakończeniu użyj var terms = termsList.ToArray();metody konwersji z powrotem na tablicę.

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();

Drugim sposobem jest zmiana rozmiaru bieżącej tablicy:

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

Jeśli korzystasz z .NET 3.5 Array.Add(...);

Oba z nich pozwolą ci to zrobić dynamicznie. Jeśli będziesz dodawać wiele przedmiotów, po prostu użyj List<T>. Jeśli to tylko kilka elementów, będzie mieć lepszą wydajność zmieniając rozmiar tablicy. Wynika to z faktu, że przy tworzeniu List<T>obiektu bierzesz większy nacisk.

Czasy w kleszczach:

3 elementy

Czas zmiany rozmiaru tablicy: 6

Czas dodawania listy: 16

400 pozycji

Czas zmiany rozmiaru tablicy: 305

Czas dodawania listy: 20

LCarter
źródło
1

Po prostu inne podejście:

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

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

return scorecard.Split("!");
Ali Humayun
źródło
3
Chociaż jest to nieco nowość, wykonuje wiele konkatenacji łańcuchów, a następnie wykonuje dużą operację wyliczania! Nie jest to najbardziej wydajny lub łatwo zrozumiały / czytelny sposób radzenia sobie z tym.
BradleyDotNET
@Ali Humayun, czy naprawdę chciałeś użyć operatora przypisania =zamiast operatora porównania? Możesz pominąć zmienną walczącą i użyć runs < 400do sterowania pętlą.
Steve
właśnie ćwiczę programistę podwójnego wejścia
Ali Humayun
1

jednym z podejść jest wypełnienie tablicy przez LINQ

jeśli chcesz wypełnić tablicę jednym elementem, możesz po prostu napisać

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

ponadto, jeśli chcesz wypełnić tablicę wieloma elementami, możesz użyć poprzedniego kodu w pętli

//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();
}
Safi Habhab
źródło
0
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}
Johnno Nolan
źródło
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.*/
        }
użytkownik3404904
źródło
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;
            }
użytkownik3404904
źródło
0

Aby dodać wartości listy do tablicy ciągów za pomocą C # bez użycia metody ToArray ()

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

Dane wyjściowe tablicy wartości zawierają:

jeden

dwa

trzy

cztery

pięć

Maghalakshmi Saravana
źródło