2008-10-14 6 views
351

Вероятно действительно простой это - я начинаю с C# и нужно добавить значения в массив, например:Добавление значений в C# массив

int[] terms; 

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

Для тех, кто использовал PHP, вот то, что я пытаюсь сделать в C#:

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

В случае, если не 'условия [] = значение;' be 'terms [] = running;'? – mayu 2013-02-07 01:28:43

ответ

608

Вы можете сделать этот путь -

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

В качестве альтернативы, вы можете использовать списки - преимущество с списками того, что вам не нужно знать размер массива при создании экземпляра списка.

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

Edit:a) for loops on List<T> are a bit more than 2 times cheaper than foreach loops on List<T>, b) Looping on array is around 2 times cheaper than looping on List<T>, c) looping on array using for is 5 times cheaper than looping on List<T> using foreach (which most of us do).

+0

В чем преимущество использования списка в этом сценарии? – 2014-02-17 11:10:11

+5

@PhillHealey Вам не нужно «знать», насколько большой может быть массив, прежде чем вы его создадите. Как вы можете видеть, в этих примерах OP должен поместить значение в «новый int [400]», - но со списком он не должен этого делать. – Hejner 2014-03-05 13:09:11

+0

вам нужно быть осторожным здесь, поскольку список просто делает расширение динамического массива под обложками, было бы хорошо, по крайней мере, знать емкость. – 2015-08-05 08:12:34

8

Вы должны выделить массив первых:

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; 
} 
0
int[] terms = new int[400]; 

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

int[] terms = new int[ArraySize]; 


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

    terms[runs] = runs; 

} 

Это было бы так, как я бы его закодировал.

2

Вы не можете просто добавить элемент в массив легко. Вы можете установить элемент в заданной позиции как fallen888, но я рекомендую использовать List<int> или Collection<int> и использовать ToArray(), если вам нужно его преобразовать в массив.

3

C# массивы фиксированной длины и всегда индексируются. Берите с раствором Моти в:

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

Обратите внимание, что этот массив является плотным массивом, непрерывный блок 400 байт, где вы можете оставить вещи. Если вам нужен массив с динамическим размером, используйте список < int>.

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

Ни ИНТ [], ни списка < Int> ассоциативный массив - это был бы словарь <> в C#. Оба массива и списки плотны.

32

Здесь приведены ответы на вопрос о том, как это сделать, используя массив.

Однако, C# имеет очень удобную вещь, называется System.Collections :)

Коллекции фантазия альтернатива использования массива, хотя многие из них использует массив внутри.

Например, у C# есть коллекция под названием List, которая очень похожа на массив 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); 
} 
69

Если вы пишете в C# 3, вы можете сделать это с однострочника:

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

Этот фрагмент кода предполагает, что у вас есть, используя директиву System.Linq в верхней вашего файла.

С другой стороны, если вы ищете что-то, что может быть динамически изменено, как представляется, это относится к PHP (я никогда не узнал об этом), тогда вы можете использовать List вместо int []. Вот что что код будет выглядеть следующим образом:

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

Примечание, однако, что вы не можете просто добавить элемент 401-й, устанавливая условия [400] значение. Вы бы вместо этого нужно вызвать Add(), например:

terms.Add(1337); 
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(); 

/* Выход:

Значение индекса 0: 400
Значение индекса 1: 400
Значение в индексе 2: 400
Показатель в индексе 3: 400
Индекс 4: 400
Показатель в индексе 5: 400 Значение индекса 6: 400
Значение индекса 7: 400
Значение индекса 8: 400
Значение индекса 9: 400
*/

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
 int runs = 0; bool batting = true; string scorecard; 
     while (batting = runs < 400) 
      scorecard += "!" + runs++; 
     return scorecard.Split("!"); 

// Только другой подход

1

Если вам действительно нужен массив, то самое простое:

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

Если вы не знаете размер массива или уже имеете существующий массив, к которому вы добавляете. Вы можете обойти это двумя способами. Первый использует общий List<T>: Для этого вам понадобится преобразовать массив в var termsList = terms.ToList(); и использовать метод «Добавить». Затем, когда это делается, используйте метод var terms = termsList.ToArray(); для преобразования обратно в массив.

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

Второй способ изменения размера текущего массива:

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 Array.Add(...);

Оба позволит вам сделать это динамически. Если вы добавите много предметов, просто используйте List<T>. Если это всего лишь пара элементов, тогда у него будет лучшая производительность, изменяющая размер массива. Это происходит потому, что вы делаете больше хитов для создания объекта List<T>.

Временав клещах:

3 шт

Массив Resize Время: 6

Список Добавить Время: 16

400 пунктов

Массив Resize Время: 305

Список Добавить Время: 20

6

Использование списка в качестве посредника является самым простым способом, как и другие описали, но с момента ввода это массив, и вы не просто хотите хранить данные в списке, я полагаю, вы можете быть обеспокоены производительностью.

Самый эффективный метод, вероятно, выделяет новый массив, а затем использует Array.Copy или Array.CopyTo. Это не сложно, если вы просто хотите, чтобы добавить элемент в конец списка:

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

Я могу также разместить код для метода расширения вставки, который принимает индекс назначения в качестве входных данных, если это необходимо. Это немного сложнее и использует статический метод Array.Copy 1-2 раза.

4

На основании ответа Thracx (я не имею достаточно очков, чтобы ответить):

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

Это позволяет добавить больше, чем просто один элемент в массив, или просто передать массив в качестве параметра для объединения двух массивов.

11

очень простой способ

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

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

результат 3,4,2

Смежные вопросы