質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

1206閲覧

Listを使わず文字列を文字列型の配列に動的に加えていく方法

widget11

総合スコア221

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/06/20 09:47

List<int> sts = new List<int>(); string[] array_string = new string[] {"1","2","3" }; foreach(var i in array_string ) { i = int.Parse(i); sts.Add(i); }

以上のようにリストのAddメソッドを使えば簡単にコレクションに文字を追加していけると思いますが、
これを配列で行う方法はあるのでしょうか?
例えば上のリストが

int[] sts = new int[]{ }; string[] array_string = new string[] {"aaaa","bbbb","cccc" } foreach(var i in ) { i = int.Parse(i);  sts = /* ここで数値型配列stsにint型にパースしたarray_stringの要素を加え新たな配列にしたい */ }

Listが便利過ぎて配列の扱い方がおざなりになっている為、勉強しています。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/06/20 10:17

> Listが便利過ぎて配列の扱い方がおざなりになっている それがまったくもって最適解だと思います。 今更缶切りや栓抜きの使い方を覚えてもしょうがないのと同様に、 必須ではありませんから必要になったら覚えれば十分です。
Q71

2019/06/20 13:57

何のためにC#を使うのでしょうか。 そんな事を言うなら、C(C++ではない)を使えばいいと思います。
guest

回答3

0

ありません。配列に要素を加えるときは新しい配列を作って既存の要素をコピーし、そこにくわえることになります。それを内部で行っているのが List です。

追記

不正確でした。

配列は連続したメモリを必要とするので、自由に動的に大きくすることはできません(小さくすることは可能です)。

しかし、新しくメモリを確保してそこに既存の配列の内容をコピーして、それを使用することで、事実上大きくすることはできます。

ただし、それはいちいちコピーしているので、元のサイズが大きくなればなるほどパフォーマンスが悪くなります。

List は内部で配列をデータの保持領域として使っています。そして領域が足りなくなれば新しく確保してコピーしています。

つまり List は領域が足りなくなった時にユーザーが割り当てなくても自動的に拡張する仕組みを備えた配列のようなものと呼ぶことができます。

ほとんどの場合、List を使うことでユーザーの負荷が減り、効率良くメモリを使うことができるので、動的にデータが増える場合は配列ではなく List を使ってください。

投稿2019/06/20 09:49

編集2019/06/20 10:47
Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

widget11

2019/06/20 09:55

早速のご回答をありがとうございます。 >新しい配列を作って既存の要素をコピーし コードで例えるとどのような形となるでしょうか?配列を飛ばしてListを使っていた為、言葉の意味が理解できませんでした。 お手数をおかけしますがよろしくお願い致します。
Zuishin

2019/06/20 09:58

var bigger = new string[array_string.Length + 1]; これで一つ大きいものが作れます。
guest

0

ベストアンサー

Listの強力な機能を使いこなせているならそれでいいのではないですか?

そもそもその例は

csharp

1var neu = sts.Concat(array_string.Select(int.Parse)).ToArray();

だと思います。

投稿2019/06/20 10:16

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/06/20 10:23

多分ですが、前提としてどういう時に配列を使い、どういう時にリストを使うのか、を質問したほうがいいのでは? 個人的には個数がおおよそ分かっていて性能がほしいとき配列で、個数が変動するか性能より便利さがほしいときがリストだと思ってます。この観点では、配列をforeachで一つずつリサイズしてたら性能がでないので、配列を使うメリットがない、と結論づけられます。
guest

0

1次元限定ではありますが、Array.Resizeを使用するとか

投稿2019/06/20 10:04

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2019/06/20 10:36

中で新しい配列を確保してコピーしているとはいえ、確かにそれがありましたね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問