ページ 1 / 1
C#でのリストの配列について
Posted: 2014年8月16日(土) 05:43
by tetsu
これまではC++を使用していましたが最近C#を勉強しています
C++とのリストと配列の操作について質問があります
C++では
コード:
vector<int> vect[3];
vect[0].push_back(2);
0番目のvector型vect内にint型の2を加えます
これをC#で実装する場合
コード:
List<int>[] list = { new List<int>(), new List<int>(), new List<int>()};
list[0].Add(2);
と現在は実装していますが、以下のように
コード:
List<int>[] list = new List<int>[3]();
まとめてnewすることはできませんか?
また、
コード:
int number = 3;
List<int>[] list = new List<int>[number]();
といったこともしたいと考えています
もしこれらが出来ないならば、
コード:
List<List<int>> list = new List<List<int>>();
for(int i=0;i<3;i++) list.Add(new List<int>());
list[0].Add(2);
といったリスト内リストを作成しなければならないのでしょうか?
Re: C#でのリストの配列について
Posted: 2014年8月16日(土) 07:39
by 海Sea
配列の初期化は、基本的に型指定の後ろに、
数を指定するので、クラスの配列の場合は、
コード:
List<int>[] list = new List<int>[3];
という感じで、大丈夫なはずです。
が、これだと配列の要素を確保しているだけです。
各配列のListのインスタンスを、
結局生成しないと使用することができません。
List内Listを作成するのと手間自体は余り変わりは無い気がします。
余談ですが、C#の基本から学ぶなら、こちらのサイトは有用です。
http://ufcpp.net/study/csharp/index.html
Re: C#でのリストの配列について
Posted: 2014年8月16日(土) 08:46
by tetsu
返信ありがとうございます
確保をした後にListのインスタンスを生成しなければならないのですね
コード:
List<int>[] list = new List<int>[3];
for(int i=0;i<3;i++)list[i] = new List<int>();
といった処理でしょうか?
固定長であることを除けばList内Listと大きな差異は感じられません
教えていただいたサイトはいつも参考にしていますが条件や配列などの基本的な部分は読み飛ばしていました
もう一度勉強してみます
Re: C#でのリストの配列について
Posted: 2014年8月16日(土) 09:13
by YuO
C#での
は,C++での
コード:
std::vector<int> *list
に,
は,C++での
コード:
std::vector<int> **list
に相当します。
C#の参照型は,C++に書き直すとポインタになると思ってよいです (配列:
System.Array含む)。
また,std::listに相当するのは
System.Collections.Generic.
LinkedListで,
Listはstd::vectorに相当します。
で,インスタンス生成については,
System.Linq.
Enumerable.
RangeとEnumerable.
SelectとEnumerable.
ToArrayを使って,
コード:
var list = Enumerable.Range(0, 3).Select(n => new List<int>()).ToArray();
と書くことができます。
実行時効率は配列をnewして一個一個List<int>をnewした方がよいですが……。
オフトピック
Range+SelectのかわりにEnumerable.
Repeatを使ってしまうと,配列要素がすべて同一インスタンスになってしまい,バグの元なので注意
Re: C#でのリストの配列について
Posted: 2014年8月17日(日) 12:39
by tetsu
なんとなくポインタっぽいと思ってはいましたが確かに参照型なのでポインタに近いですね
LINQはC#の特徴であり便利そうなので重点的に勉強してみます
ありがとうございました