• ベストアンサー

c# でList<T>と似たものを作りたい

c#初心者です。 c#のList<T>などのコレクションのように動的かつ高速に配列の容量を変更できるクラスを作りたいのですが、Listの構造すら分からないわ、普通の配列で色々やってみて上手くいかないわで困っています。 要はListやDictionaryがもつAddメソッドの基本的な内容が分かれば良いのですが、どなたか教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

早いかどうか知らないけれど、 MSの.NET FrameworkではなくMonoでよければ >要はListやDictionaryがもつAddメソッドの基本的な内容が分かれば良いのですが、どなたか教えていただけないでしょうか? これは可能。 https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs とか https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/Dictionary.cs を参考にしてみる手もあるのかな?

koumei000
質問者

お礼

ありがとうございます。 Listの内容は少々難しいので、時間をかけて読みます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c# 要素と値

     こんにちは、c#初心者です。  細かいことなんですが、気にしだしたら止まらなくなって、遂に質問です。  配列などで、そのインデックスの位置に含まれているオブジェクトは”値”と呼ばれているところを見かけるのですが、List<T>などのコレクションでは”要素”と呼ばれているのを見かけます。  例えば、Array.IndexOfメソッドでは、XMLに「値を検索します」と書かれている上に、「T value」と値であることが明記してあります。  一方、List<T>のIndexOfメソッドでは、”要素”と書かれていて、「T item」となっています。  「配列の中身は値(value)、コレクションの中身は要素(item)と区別しているのか」と納得しかけていた矢先、Array.Exists 「指定された配列に、……”要素”が……」と配列でも要素という単語が使用されているじゃないですか!  もう訳が分かりません。確かに、値と要素なら大して意味の違いはないので読み手には問題ないですが、書き手にとってはどう使い分ければよいのかちんぷんかんぷんです。  どなたか使い分けの分かる人がいらっしゃいましたら教えていただけませんか?

  • c# 特徴の命名の仕方

     こんにちは、いつものごとく、命名だけで一週間悩むc#初心者です。  現在ライブラリを作っています。  その中にコレクションクラスで、「SampleCollectionBase」という親クラスから、外観は等しく、「値の取得/設定」が高速なクラスと、「値の追加」が高速なクラスの二つをつくり、用途に合わせて使い分ける予定です。  内部の動作がまるっきり異なるので、ことに「追加・挿入」に関しては「List<T>」と「LinkedList<T>」ほどの計算量に差があるので、どちらかを作らないというのはかなり抵抗があります。  それで、命名方法なのですが、名前に性質を付けて、「QuickAccessSampleCollection」、「QuickAddSampleCollection」のような名前にするのがいいか、「LinkedList<T>」や「HashTable」のように構造を名前に付けて、「SampleCollection」、「構造名SampleCollection」のような名前にするのがいいか迷っています。  どなたか分かる方がいらっしゃいましたら教えていただけませんか?

  • C#の連結リストがわかりません。

    最近、C#をちゃんとやろうと思い、勉強のためのコードを見ていたのですが以下の連結リストについてわかりません。わからないところにコメントをつけました。呼び出しメソッドはList.Add(2);です。よろしくお願いいたします。 using System; using System.IO; class Node { public int elem; public Node next; public Node() : this(0, null){}//このメソッドがある意味がわかりません。 public Node(int val, Node next) { this.elem = val; this.next = next;//なぜか最初にnextにデバッグするとnullになりますが2回目デバッグからはNodeになります。そもそもなぜクラスにクラスを代入しているかもわかりません。 } } /// <summary> /// 連結リストクラス /// </summary> class List { public Node head; public List() { head = null; } public void Add(int val) { Node node = new Node(val, this.head); this.head = node; } }

  • C言語で使うことの出来る配列のLIB

    C言語から使うことの出来るSTLのコンテナクラスのようなものはありますでしょうか? 配列の追加、削除、検索、更新を高速で処理したいので(LIST構造)、汎用的に使えるLIBのようなものがあれば教えていただきたいです。

  • C++/CLIとC#の連携について

    いつも拝見させていただいております。 現在、C++/CLIとC#にて連携を行っているのですが、C++/CLIで作成したクラス配列 がC#側でどのようにすれば受け取れるのか方法がわかりません。 C++/CLIで作成しているクラス配列はSystem::Collections::Generic::Listを使用 して配列化しています。 下記がC++/CLIのソースになります。 List<testClass>^% testClass::GetList() { List<testClass>^ lpTestClassList = gcnew List<testClass>(); testClass^ lpTestClass; lpTestClass = gcnew testClass(); lpTestClassList->Add(lpWatchServiceMasterInfoWrapper); return lpTestClassList; } これをC#側で使用しようとすると下記エラーが発生します。  「この言語によってサポートされていません」 C++/CLI⇒C#間の連携ではListクラスを使用することは不可能なのでしょうか? クラスを配列にして引き渡したいだけなので、他の方法等含めて何か参考になることがありましたら ご教授ください。 よろしくお願い致します。 開発環境  C++/CLI ⇒ DLL(ネイティブなコードを参照するためのラッパー用DLL)  C# ⇒ アプリケーション

  • 計算量オーダーについて O(1/n)オーダー?

     こんにちは、c#初心者です。  今回は計算量オーダーの話なので、基本的に言語は関係ないと思います。  計算量オーダーの基本的な部分は分かるのですが、O(1/n)オーダーのアルゴリズムは(今のところは)まだ見かけないというか、名前程度しか知らないので、これに関しては無知です。そこで、この場合はどういうオーダーになっているのかという質問です。  質問は3つあります。 1)この一連の処理はO(1/n)オーダーになっているか? int count = 1000 / length; // lengthは正の整数 for ( int i = 0; i < count; i++ ) Do(); // O(1)オーダーの処理 2) (1がO(1/n)の場合)繰り返す処理がO(n^2)になった場合に、この一連の処理はO(n)オーダーになるのか? int count = 1000 / length; // lengthは正の整数 for ( int i = 0; i < count; i++ ) Do(); // O(n^2)オーダーの処理 3)配列型のコレクション(コレクションって、c#の呼び方だったっけ?) [c#] List<T>,[c++] Bector, [Java] ArrayList(だったっけ?)のようなクラスのAddメソッドのオーダーは? //Addメソッドの中身 if ( Capacity == Count ) Expand(); // Expandは配列の容量を2倍に拡張するO(n)処理とします。 array[Count++] = item;  以上です。  補足で、2)については大学の教授に「一回でもO(n^2)の処理が呼び出されたら、O(n^2)オーダーになる」と言われましたが、納得いかないです。確かに、O(1/n)オーダーの処理の後にO(n^2)オーダーの処理を行えば、そうなるのは納得いくのですが……という感じです。教授が読み間違えたとは考えにくいですが(確かにちょっと忙しそうでしたが)、念のため質問です。  それと、3)はよくある配列型のコレクションのまねです。「もし内容物が容量一杯になれば拡張→追加」を繰り返すとした場合です。ExpandメソッドのオーダーがO(n)なので、単純に計算すればO(n)オーダーになるのですが、呼び出される頻度が「(拡張された容量)回に1回」です。  例えば、容量が4ずつ拡張されるとすれば、「4回に1回」拡張が必要になり、10ずつ拡張されるとすれば、「10回に1回」の拡張が必要です。この場合、どう考えても全体として定数で割っているだけなので、O(n)オーダーのままになるのは明白なのですが、今回は容量2倍とさせていただきました。すると拡張の頻度は「(さっきまでの容量)回に1回」の頻度で、容量に反比例し、直感的にはO(Count / Capacity) = O(1)オーダーに見えるのですが、この判断は正しいでしょうか?  皆さんのご意見を伺わせてください。

  • C# List<>が表示されない

    C# List<>が表示されない Visual Studio にて作成 lblCalendar = new List<Label>(); for (int iAllCount = 0; iAllCount < 42; iAllCount++) { lblCalendar.Add(new Label()); } // ptbCalendar = new List<PictureBox>(); for (int iAllCount = 0; iAllCount < 42; iAllCount++) { ptbCalendar.Add(new PictureBox()); } // ptbCalendar[ptCalendar].BackColor = Color.FromArgb(100, 255, 255, 255); それぞれ42個生成しました。 それをカレンダーメソッドを作って画面に表示させました。 ピクチャーはColor.FromArgb(100, 255, 255, 255)で透過させました。 最初の画面(現在だと2月の画面が最初)は正常にカレンダーが表示されピクチャーは隠れています。 ですが private void button1_Click(object sender, EventArgs e) { month--; if (month == 0) { year = year - 1 month = 12; } CaledarControl(year, month);//カレンダー用のメソッド ptbControl(); //ピクチャー用のメソッド this.Refresh(); } これで次の月のページに飛ぶとカレンダーが全部消えてしまい、隠れていたピクチャーがすべてでてしまいます。 どうすればこのバグがなくなりますか?

  • PHPのようにスマートに配列の配列など記述する方法が

    PHPの場合、データ構造ですが以下のようになっています。 $a = array( "test1" => array( array(1,1), array("x", 2) ), "test2" => array( array(3,2), array("y", 1) ), ); これをエクセルVBAの場合、Scripting.Dictionaryを使えば連想配列が 可能ですが、PHPのようにスマートに配列の配列など記述する方法が わかりません。 Dim dic As Scripting.Dictionary set dic = New Scripting.dictionary dic.Add "test1", ???????????????? dic.Add "test2", ???????????????? スマートにデータ構造を実現できる方法が知りたいです。

  • C++で逐次動的に配列を確保

    C++初心者です。 よろしくお願いします。 あるクラスのポインタのリストがあって、末端にはNULLを入れてます。 そのリストをNULLが来るまでfor文で回して クラスのメンバを別で用意した配列に逐次代入したいのですが リスト内に何個クラスがあるのか分からないので、配列を確保できません。 一度回しきってクラスの数を数えてからその分を確保して もう一度回して代入すれば解決は出来ると思うのですが やはり効率が悪いと思うので 効率よく配列を確保できる方法がございましたらご教授よろしくお願いします。

  • ListにDialogを格納して閉じたら削除 C#

    Visual C# で複数のモードレスダイアログを表示させ、 一括で最前面表示の有効・無効を切り替えるために List配列にインスタンスを格納しました。 ・Form1 public List<MyDialog1> dialogList = new List<MyDialog>(); ・ボタンのクリック時 MyDialog dialog = new MyDialog(); dialogList.Add(dialog); 動作としては問題なかったのですが、ダイアログを閉じた際 リストからそのダイアログのインスタンスを削除したいのですが、 どのようにすればいいのでしょうか? 現状わからない点は、ダイアログのクラスからオーナーのFormのプロパティにアクセスする方法と、 リスト内のインスタンスのうち、閉じるイベントを発生させたのはどのインスタンスであるかを区別する方法です。