C#でReadOnlyCollectionを使っての定義についての質問

このQ&Aのポイント
  • C#でReadOnlyCollectionを使っての定義についての質問です。
  • 2次元配列の定数を定義したいが、うまく定義できない。
  • ヘッダファイルのように別ファイルに記述して全体に共有したい。
回答を見る
  • ベストアンサー

ReadOnlyCollectionで二次元配列

初心者丸出しの質問で申し訳ありませんが C#でReadOnlyCollectionを使っての定義についての質問です ホテルのルームナンバーなのですが 2次元配列の定数を定義したいのですが うまく定義できなくて困っています いろんなクラスで使いたいのでCのヘッダファイルのように 別ファイルに記述して全体に共有したいのです こうやって記述するべき とか こういう場合はこういうやり方を使うのが一般的です とか なんでもいいので教えていただけると助かります 間違っていますが、なんとなくやりたいことの雰囲気を つかんでもらうために下に記述します class Read { public ReadOnlyCollection<string>[,] roomNo = new string[4, 62] { { "201", "202", "203", "204", "205", "206", "207", "208", "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220", "221", "222", "223", "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", "254", "255", "256", "257", "258", "259", "260", "261", "262"}, { "301", "302", "303", "304", "305", "306", "307", "308", "309", "310", "311", "312", "313", "314", "315", "316", "317", "318", "319", "320", "321", "322", "323", "324", "325", "326", "327", "328", "329", "330", "331", "332", "333", "334", "335", "336", "337", "338", "339", "340", "341", "342", "343", "344", "345", "346", "347", "348", "349", "350", "351", "352", "353", "354", "355", "356", "357", "358", "359", "360", "361", "362"}, { "401", "402", "403", "404", "405", "406", "407", "408", "409", "410", "411", "412", "413", "414", "415", "416", "417", "418", "419", "420", "421", "422", "423", "424", "425", "426", "427", "428", "429", "430", "431", "432", "433", "434", "435", "436", "437", "438", "439", "440", "441", "442", "443", "444", "445", "446", "447", "448", "449", "450", "451", "452", "453", "454", "455", "456", "457", "458", "459", "460", "461", "462"}, { "501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512", "513", "514", "515", "516", "517", "518", "519", "520", "521", "522", "523", "524", "525", "526", "527", "528", "529", "530", "531", "532", "533", "534", "535", "536", "537", "538", "539", "540", "541", "542", "543", "544", "545", "546", "547", "548", "549", "550", "551", "552", "553", "554", "555", "556", "557", "558", "559", "560", "561", "562"} }; }

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

  • ベストアンサー
  • hoge1229
  • ベストアンサー率29% (58/194)
回答No.1

ReadOnlyCollectionは実装なのでstringの配列からはキャストできないかと。 ReadOnlyCollectionでやりたいなら下記のような感じになるんじゃないんですかね。 var Lev1 = new ReadOnlyCollection<string>(new List<string> {"101", "102", "103"}); var Lev2 = new ReadOnlyCollection<string>(new List<string> {"201", "202", "203"}); var Lev3 = new ReadOnlyCollection<string>(new List<string> {"301", "302", "303"}); var Hotel = new ReadOnlyCollection<ReadOnlyCollection<string>>( new List<ReadOnlyCollection<string>> {Lev1, Lev2, Lev3}); もしくは、下記のようにIReadOnlyCollectionにキャストし、読み取り操作しかできないようにするとかですかね。 IReadOnlyCollection<IReadOnlyCollection<string>> coll2 = new List<IReadOnlyCollection<string>> { new string[] {"1", "2", "3"}, new string[] {"4", "5", "6"}, new string[] {"7", "8", "9"} };

condor2
質問者

お礼

ありがとうございます 定義部分のエラーがなくなり いけそうな感じになってきたのですが IReadOnlyCollectionについていくら検索しても foreach で値を全部出すものばかりで たとえば ボタンにルームナンバーを表示するのに e.Graphics.DrawString( roomNo[1, 4], <=この部分 new Font("Arial", 18, FontStyle.Bold), brush, btn.ClientRectangle, sf ); みたいな感じで使う場合 どのようにすれば実現できるでしょうか? さらに質問で大変申し訳ないですが 教えていただけると助かります

condor2
質問者

補足

お礼コメントの自己回答です こんな感じでやってうまくいきました e.Graphics.DrawString( roomNo.ElementAt(1).ElementAt(4), new Font("Arial", 18, FontStyle.Bold), //フォント brush, btn.ClientRectangle, sf ); 無事解決です ありがとうございました

関連するQ&A

  • jspでの二次元配列

    こんにちは。初めて質問させていただきます。よろしくお願いします。 現在javaで作ったプログラムをjspでも使えるようにしようと考えているのですが、 二次元配列がうまくjspで反映されず困っています。 jspに関してはほとんど無知で一から勉強している次第です。 そのためなるべく簡単に、と思い 以下のプログラムを、<% %>の間に入れるだけで動かせないかと思ったのですが エラーが出てしまいました。一次元の配列ならばできたのですが... ちなみに以下のプログラムはcsvファイルを読み込み、 多次元配列に格納していくというものです。 稚拙なプログラムで申し訳ありません... どなたかご教授いただければ幸いです。 import java.io.*; import java.util.StringTokenizer; import java.util.ArrayList; class Dog{  public static void main(String args[]) throws IOException{      String csv = "dognum.csv";      BufferedReader br = new BufferedReader(new FileReader(csv)); String[][] array = new String[100][]; int i = 0; while (true) { String line = br.readLine(); if(line==null) break; array[i] = line.split(","); i++; } for (i = 0; i < 101; i++) { for (int j = 0; j < array[i].length; j++) { System.out.println("["+i+"]["+j+"] = " + array[i][j]); } } } }

  • 二次元配列について

    csvファイルを読み込み 、(コンマ)毎に区切り出力するプログラムを今作っています。 そこで最初に import java.io.*; import java.util.*; public class aaa { public static void main(String aaa[]) throws Exception{ Scanner yomi = new Scanner( new File("C:\\addorres.csv") ); yomi.useDelimiter( "," ); List<String> adorr = new ArrayList<String>(); while( yomi.hasNext() ){ adorr.add( yomi.next() ); } for( String s: adorr ){ System.out.println( s ); } } } と打ちましたそうすると csvに 名前、住所、電話、アドレス、ID、PW 名前、住所、電話、アドレス、ID、PW 名前、住所、電話、アドレス、ID、PW と入っていると表示されるのは 名前 住所 電話 アドレス ID PW 住所 電話 アドレス ID PW 住所 電話 アドレス ID PW となってしまって名前を取り出すことができません。 そこで最初は名前入っていたんだからと安直に二次元配列に変えることにしました。 import java.io.*; import java.util.*; public class aaa { public static void main(String aaa[]) throws Exception{ String[][] ad = new String[9999][9999]; int a = 0,c = 0,d=0; Scanner yomi = new Scanner( new File("C:\\addorres.csv") ); yomi.useDelimiter( "," ); List<String> adorr = new ArrayList<String>(); while( yomi.hasNext() ){ adorr.add( yomi.next() ); } for( String s: adorr ){ if(a==5) { c++; a=0; ad[a][c] = s; d++; }else{ ad[a][c]= s; a++; d++; } } a = 0; c = 0; for (int b=0;b<d;b++) { if(a==5) { c++; a=0; System.out.println(b+":"+ad[a][c]); }else{ System.out.println(b+":"+ad[a][c]); a++; } } } } そこでこの様に打ったんですが実行すると Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at aaa.main(aaa.java:7) と結果がこの様にエラーとして返ってきます。 どなたかこれを解決する方法又は1次元配列でも名前を表示させる方法がわかる方がいましたら お願い致します。

    • ベストアンサー
    • Java
  • 多次元配列のソートがうまくいかない

    多次元配列のソートがうまくいかない 質問失礼します. 以下のような,String型,int型,double型の混在した多次元配列([3][3]の配列)をソートするプログラムを作成しました. このプログラムでは3番目の項目でソートを行っています. 問題点なのですが, 3番目の項目がdouble型の一桁(例えばarray[1][2]が2.0)ならばうまくソートできるのですが, 一つを2桁(例えばarray[1][2]を10.0)にすると何故か先頭の数(10.0の場合1)を基準にソートされてしまっているようです・・・ 配列へのデータの入れ方が間違っているのでしょうか? 原因がはっきりわからず困っているのですが, わかる方いましたらよろしくお願いします. public class Sort_test { /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ String[][] array = new String[3][3]; array[ 0 ][ 0 ] = "A"; array[ 0 ][ 1 ] = 2001+""; array[ 0 ][ 2 ] = 9.0+""; array[ 1 ][ 0 ] = "B"; array[ 1 ][ 1 ] = 1001+""; array[ 1 ][ 2 ] = 2.0+""; array[ 2 ][ 0 ] = "C"; array[ 2 ][ 1 ] = 3001+""; array[ 2 ][ 2 ] = 6.0+""; TheComparator comparator = new TheComparator(); // 3番目の項目でソートするように設定 comparator.setIndex( 2 ); // ソート実施 Arrays.sort( array, comparator ); dump(array); } public static void dump( String[][] array ) { for ( int i = 0;i < array.length;i++ ) { for ( int j = 0; j < array[ i ].length;j++ ) { System.out.print( "\t" + array[ i ][ j ] ); } System.out.println(); } } } //多次元配列ソート用クラス class TheComparator implements Comparator { /** ソート対象のカラムの位置 */ private int index = 0; /** ソートするためのカラム位置をセット */ public void setIndex( int index ) { this.index = index; } public int compare( Object a, Object b ) { String[] strA = ( String[] ) a; String[] strB = ( String[] ) b; return ( strA[ index ].compareTo( strB[ index ] ) ); } }

    • ベストアンサー
    • Java
  • VB.NET 2次元配列

    二次元配列に関して質問があります。 二次元配列を定義します。 Dim a(,) As Integer = _ {{0, 0, 0, 0, 0, 0, 1, 1, 1}, _ {0, 0, 0, 0, 0, 1, 0, 0, 1}, _ {0, 0, 0, 0, 0, 0, 1, 1, 1}} 一次元配列を定義します。 Dim b() As Integer 一次元配列のb()に二次元配列a(,)の {0, 0, 0, 0, 0, 0, 1, 1, 1}の部分を 入れようとした場合、 どのように記載すればよろしいでしょうか? イメージ的には b = a(0) で出きると思ったのですが、 構文エラーとなってしまいます。 よろしくお願いします。

  • 多次元配列のカウント+1の仕方

    多次元配列のカウント+1の仕方 下記のような多次元配列(ちなみに、これって二次元配列ですか?)があるとき、 常に、「2列目の0がある数+1」を返すようにしたいのですが、 どうすればよいのでしょうか? $data[0][1]とか$data[1][1]とか$data[2][1]とかの意味です。 下記の例でいくと、2列目に0が3つあるので、数値の4を返したいのですが…、 ■$data 1,0,A1,B1,C1 2,0,A2,B2,C2 3,0,A3,B3,C3 4,2,A4,B4,C4 ■var_dump($data); array(4) { [0]=> array(5) { [0]=> string(1) "1" [1]=> string(1) "0" [2]=> string(2) "A1" [3]=> string(2) "B1" [4]=> string(2) "C1" } [1]=> array(5) { [0]=> string(1) "2" [1]=> string(1) "0" [2]=> string(2) "A2" [3]=> string(2) "B2" [4]=> string(2) "C2" } [2]=> array(5) { [0]=> string(1) "3" [1]=> string(1) "0" [2]=> string(2) "A3" [3]=> string(2) "B3" [4]=> string(2) "C3" } [3]=> array(5) { [0]=> string(1) "4" [1]=> string(1) "2" [2]=> string(2) "A4" [3]=> string(2) "B4" [4]=> string(2) "C4" } }

    • ベストアンサー
    • PHP
  • 定数配列の書き方

    VB6で定数を定義する場合は次の通りです。   Const strTest As String = "TEST" では、定数配列を定義する場合はどのように書けばいいのでしょう?   Const astrTest() As String = Array("A", "B", "C")      '→NG   Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。 どのように書けばいいのでしょうか? それとも定数を配列で定義するのは無理なんでしょうか?

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • csvファイルを2次元配列に格納

    Javaの勉強をしています。 csvファイルを読み込んで2次元配列に格納する方法を教えて下さい。 1次元の配列なら下記のようにして出来たのですが、2次元の配列に格納する方法が分かりません。 ------------------------------ try { File csv = new File("xxx.csv"); BufferedReader brf = new BufferedReader(new FileReader(csv)); while(brf.ready()) { String line = brf.readLine(); String[] data = line.split(","); for(int j=0; j<data.length; j++) { System.out.print(data[j] + "\t"); } System.out.println(); } brf.close(); } catch(FileNotFoundException e) { e.printStackTrace(); } catch(IOException e) { e.printStackTrace(); } --------------------------- 一度はできないのかと思い、上記の1次元配列のdata[j]を2次元配列のarray[i][j]に代入してみたのですが出来ませんでした。 回答宜しくお願い致します。

    • ベストアンサー
    • Java
  • C# 配列の配列(多次元配列?)

    C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定  テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する   A=1,2,3・・・   B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) {  string strBuffer;  //「=」前の値格納用変数  string[] strBuffer2; //「=」後の値格納用配列  listtmp=null;  //strtmpに「=」前の値を格納  strtmp = TextLine.Split('=').GetValue(0).ToString();  //strtmp2に「=」後の値を格納(配列)  strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(',');  for (int i = 0; i <= strtmp2.Length - 1; i ++)  {   //[i,0]に、「=」前の値を代入   if (i == 0)   {   listtmp.Add(strtmp);   }   else   {   listtmp.Add(strtmp2[i].ToString());   }  }  //list配列にlistTmp配列を格納(配列の配列)  list.Add(listtmp);  intT = intT + strtmp2.Length;  //行数カウント  intTLine = intTLine + 1;  } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。

  • if文内の二次元配列の設定方法について

    if文内の二次元配列の設定方法について 区分の内容によって2つのクラスを呼び分けていたのですが、今回そのクラスを統合しようとしています。 そこで、2つのjavaソースを統合するにあたり、ソース内で使用している二次元配列の内容を区分によって書き換えたいのですが、 if文内に記述するため、その変数の有効範囲がif文内だけになってしまいます。 クラス全体でその配列を参照できるようにするにはどのように記述すればよいのでしょうか? <統合前> Test1.java public class Test1 { private static final String[][] LST = {{3,0,0},{0,0,1},{0,0,1}}; public void initialize() { System.out.println(LST[0][0]); } ⇒【実行結果】3 Test2.java public class Test2 { private static final String[][] LST = {{2,0,0},{0,0,1},{0,0,2},{0,0,3}}; public void initialize() { System.out.println(LST[0][0]); } ⇒【実行結果】2 上記2つのファイルを統合し、区分によって二次元配列の内容を設定する。 <統合案1> Test1.java public class Test2 { private String[][] LST; public void initialize() { if (kubun == 1) { String[][] LST = {{3,0,0},{0,0,1},{0,0,1}}; }else{ String[][] LST = {{2,0,0},{0,0,1},{0,0,2},{0,0,3}}; } System.out.println(LST[0][0]); } ⇒【実行結果】NullExceptionが発生してしまいます。 <統合案2> public class Test2 { private String[][] LST; public void initialize() { if (kubun == 1) { LST = {{3,0,0},{0,0,1},{0,0,1}}; }else{ LST = {{2,0,0},{0,0,1},{0,0,2},{0,0,3}}; } System.out.println(LST[0][0]); } ⇒【実行結果】コンパイルエラーが発生してしまいます。(式の開始が不正です。) ※kubunが1のときと、それ以外のときで作成される二次元配列の要素数は異なります。 ※kubunの内容によって、一度二次元配列の内容を設定してしまえば、あとは同じ内容のままです。 最初の変数の宣言の仕方、二次元配列の内容設定の仕方等、 どのようにすればよいかご教授よろしくお願い致します。

    • ベストアンサー
    • Java