web-dev-qa-db-ja.com

C#配列に値を追加する

おそらく非常に単純なものです - 私はC#から始めて、配列に値を追加する必要があります、例えば:

int[] terms;

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

PHPを使用したことがある人のために、これが私がC#でやろうとしていることです:

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

あなたはこのようにすることができます -

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

編集:a) for List <T>のループは foreach List <T>のループより2倍安い、b)配列のループは2前後List(<T>)でループするよりも2倍安い(c) for を使用して配列でループするのは5倍安い foreach (ほとんどの場合)。

736
Tamas Czinege

C#3で書いているなら、ワンライナーでそれをすることができます:

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

このコードスニペットは、ファイルの先頭にSystem.Linqのusingディレクティブがあると想定しています。

一方、PHPのように動的にサイズ変更できるものを探しているのであれば(実際にはそれを学んだことはありません)、Listを使用することをお勧めしますint []ではなくthatcodeは次のようになります。

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

ただし、terms [400]に値を設定して401番目の要素を単純に追加することはできません。このように、代わりにAdd()を呼び出す必要があります。

terms.Add(1337);
83
David Mitchell

Linq の方法 Concat を使うとこれが簡単になります。

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

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

結果3,4,2

45

配列を使用してそれを行う方法についての答えはここに提供されています。

しかし、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);
}
37
FlySwat

仲介者としてリストを使用するのが他の人が説明したように最も簡単な方法ですが、あなたの入力は配列であり、あなたは単にリストにデータを保存したくないので、私はあなたがパフォーマンスを心配するかもしれません。

最も効率的な方法は、新しい配列を割り当ててから、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;
}

必要に応じて、宛先インデックスを入力とするInsert拡張メソッドのコードを投稿することもできます。もう少し複雑で、静的メソッドArray.Copyを1〜2回使用します。

11
Thracx

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

これにより、配列に複数の項目を追加したり、2つの配列を結合するためのパラメーターとして配列を渡したりすることができます。

10
Mark

最初に配列を割り当てる必要があります。

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;
}
8
Motti
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

それは私がそれをコーディングする方法です。

5
JB King

C#配列は固定長で、常にインデックス付けされています。 Mottiの解決策に従ってください。

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

この配列は稠密配列であり、400バイトの連続ブロックであり、ここでドロップすることができます。動的サイズの配列が必要な場合は、List <int>を使用してください。

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

Int []もList <int>も連想配列ではなく、C#ではDictionary <>になります。配列とリストはどちらも高密度です。

4
Jimmy

ちょっと違うアプローチ:

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

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

return scorecard.Split("!");
3
Ali Humayun
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]インデックス1の値:400
[2]インデックス2の値:400
インデックス3の値:400
インデックス4の値:400
インデックス5の値:400
[6]インデックス6の値400
[7]インデックス7の値:400
インデックス8の値:400
インデックス9の値:400
* /

2
jhyap

あなたは簡単に配列に要素を追加することはできません。 fallen888のように要素を指定の位置に設定できますが、代わりにList<int>またはCollection<int>を使用することをお勧めします。必要に応じてToArray()を使用することをお勧めします。配列に変換されます。

2
Michael Stum

本当に配列が必要な場合は、次のものがおそらく最も簡単です。

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

追加するアレイのサイズがわからない場合、または既存のアレイがすでにある場合。これには2つの方法があります。一つ目は一般的なList<T>を使うことです:これをするためにあなたはvar termsList = terms.ToList();に配列を変換して、Addメソッドを使いたいでしょう。その後、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();

2番目の方法は現在の配列のサイズを変更することです。

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>を使うだけです。それがほんの2、3の項目であるならば、それは配列をリサイズするより良いパフォーマンスを持つでしょう。これはList<T>オブジェクトを作成するためにより多くのヒットがあるためです。

Timesの目盛り:

3項目

配列サイズ変更時間:6

リスト追加時間:16

400アイテム

配列サイズ変更時間:305

リスト追加時間:20

1
LCarter
         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
user3404904
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}
0
Johnno Nolan
            /*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
user3404904

私はこれを他の変種に追加します。私はこの種の機能的コーディングラインをもっと好む。

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