C#配列への値の追加


512

おそらくこれは本当に単純なものでしょう-私はC#から始めて、配列に値を追加する必要があります。例えば:

int[] terms;

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

PHPを使用したことがある人のために、私がC#でやろうとしていることは次のとおりです。

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

10
「terms [] = value;」にすべきではありません 'terms [] =実行する;'?
ティムタム

C#では、作成後に配列サイズを変更することはできません。配列のようなものが必要だが要素を追加/削除できるようにするには、List <int>()を使用します。
Kamran Bigdely

回答:


822

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

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)List <T>のforループは、List <T>のforeachループよりも2倍以上安い、b)配列のループはList <T>のループよりも約2倍安い、c)ループするforを使用した配列は、foreachを使用したList <T>でのループよりも5倍安価です(ほとんどの場合)。


2
このシナリオでリストを使用する利点は何ですか?
Phill Healey、2014

9
@PhillHealey配列を作成する前に、配列がどれほど大きくなるかを「知る」必要はありません。ご覧のとおり、これらの例では、OPは値を "new int [400]"に入力する必要がありますが、リストを使用すると、そうする必要はありません。
Hejner、2014年

3
値がどこにも定義されていないので、コードの最初のビットは何もありません。-_-
EasyBB、2015

1
ARRAYにはサイズが必要だと言うのはなぜですか??? やるだけnew int[]{}!!!!!
T.Todua 2017年

6
@ T.Toduaあなたが提案しているように空の配列を作成し、それから存在しないインデックスにアクセスして値を設定しようとするとOutOfRangeException、コードを実行するとすぐにが取得されます。配列は使用するサイズで初期化する必要があります。配列は最初にすべてのスペースを予約します。魔女はそれらを非常に高速にしますが、サイズを変更することはできません。
KinSlayerUY 2018

85

C#3で記述している場合は、ワンライナーでこれを行うことができます。

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

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

一方、PHPの場合のように、動的にサイズ変更できるものを探している場合(実際には学習していません)、int []の代わりにListを使用することをお勧めします。 。ここで何がそのコードは次のようになります。

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

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

terms.Add(1337);

65

LinqのメソッドConcatを使用すると、これが簡単になります

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

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

結果3、4、2


12
このメソッドは、400アイテムを配列に追加し、1つのスペースを追加した配列のコピーを作成し、すべての要素を新しい配列に400百回移動します。したがって、賢明なパフォーマンスは推奨されません。
KinSlayerUY 2018

39

配列を使用してそれを行う方法についての回答はここにあります。

ただし、C#にはSystem.Collectionsと呼ばれる非常に便利なものがあります。

コレクションの多くは内部で配列を使用しますが、コレクションは配列を使用するための優れた代替手段です。

たとえば、C#には、PHP配列とよく似た機能を持つListというコレクションがあります。

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 a = list [i];
Behzad 2013年

10

他の人が説明したように、中間としてリストを使用するのが最も簡単な方法ですが、入力は配列であり、データをリストに保持したくないだけなので、パフォーマンスに懸念があると思います。

最も効率的な方法は、新しい配列を割り当ててから、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回使用します。


2
リストを作成し、それを埋めて、最後にこの配列へのコピーを実行する方がはるかに優れており、パフォーマンスの面で優れているため、配列を作成して400回以上コピーすることはありません
KinSlayerUY

10

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つの配列を結合したりできます。


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

5
int ArraySize = 400;

int[] terms = new int[ArraySize];


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

    terms[runs] = runs;

}

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


3

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 <>になります。配列とリストの両方が密集しています。


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

/*出力:

400:インデックス0の値
400:インデックス1の値
400:インデックス2の値
400:インデックス3の値
400:インデックス4の値
400:指標5の値
400:指標6の値
400:インデックス7における値
の値でインデックス8:400
インデックス9の値:400
* /


この解決策を説明できますか?
2013年

ルーン、私はソースコード内にコメントを含めました>それがあなたの質問に答えられることを願っています。
jhyap 2013年

2

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


2

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

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

これを別のバリアントに追加します。私はこのタイプの関数型コーディング行をもっと好みます。

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

1

配列のサイズがわからない場合、または追加する既存の配列がすでにある場合。これには2つの方法で対処できます。1つ目はジェネリックを使用する方法です。List<T>これを行うには、配列をaに変換し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>。数個のアイテムの場合は、配列のサイズ変更のパフォーマンスが向上します。これは、List<T>オブジェクトを作成するためにより多くのヒットを取得するためです。

タイムズ ティック:

3アイテム

配列サイズ変更時間:6

リスト追加時間:16

400アイテム

配列のサイズ変更時間:305

リスト追加時間:20


1

ちょうど異なるアプローチ:

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

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

return scorecard.Split("!");

3
少し斬新ですが、これは多くの文字列連結を実行してから、大きな列挙演算を実行しています!これについては、最もパフォーマンスが高くないか、簡単に理解/読みやすい方法ではありません。
BradleyDotNET 2014

@Ali Humayun本当に=比較演算子の代わりに代入演算子を使用するつもりでしたか?バトル変数を省略してruns < 400、ループの制御に使用できます。
Steve

ダブルエンテンダーのプログラミングを練習しているだけ
アリフマユーン

1

1つのアプローチは、LINQを介して配列を埋めることです

配列に1つの要素を入力する場合は、次のように簡単に記述できます

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

さらに、配列に複数の要素を入れたい場合は、前のコードをループで使用できます

//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
         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()メソッドを使用せずにC#を使用して文字列配列にリスト値を追加するには

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

値配列の出力には以下が含まれます。

1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.