前提・実現したいこと
いつもお世話になっています。
C言語のように構造体自体に配列を持ち、
CSVデータを読み込んで共有したいと考えています。
ところがC#
で検索しても、いまいちこれというのに出会えておりません。
発生している問題
共有するために下記のメソッドを追記しましたが、
グローバルで配列として持つことが出来ません。
c#
1public struct DataArray 2{ 3 // CSV取込み用構造体 4 public string DESTNAME; // 発注元名 5 public int DESTCODE; // 発注元コード 6 public string PNAME; // 品名 7 public string PNUM; // 品番 8 public int PCS; // 数量 9 public float PRICE; // 単価 10 public float SUBTOTAL; // 小計 11 public string DESIDATE; // 希望納期 12 public DataArray(string dname, int dcode, string pname, string pnum 13 , int pcs, float price, float subtotal, string desidate) 14 { 15 this.DESTNAME = dname; 16 this.DESTCODE = dcode; 17 this.PNAME = pname; 18 this.PNUM = pnum; 19 this.PCS = pcs; 20 this.PRICE = price; 21 this.SUBTOTAL = subtotal; 22 this.DESIDATE = desidate; 23 } 24} 25 26class hogehoge 27{ 28 public void Main() 29 { 30 String filename = ""; 31 int cnt = 0; 32 int status = 0; 33 string msg; 34 string title; 35 DataArray[] da = new DataArray[0]; // CSVデータ保存構造体 36 37 // CSVファイルの指定用ダイアログの設定 38 OpenFileDialog op = new OpenFileDialog(); 39 op.Title = "ファイルを開く"; 40 op.InitialDirectory = @"C:\"; 41 op.FileName = ""; 42 op.Filter = "CSVファイル(*.csv;*.txt)|*.csv;*.txt|全てのファイル(*.*)|*.*"; 43 op.FilterIndex = 1; 44 45 // ダイアログを表示しファイル名を取得 46 DialogResult result = op.ShowDialog(); 47 48 if (result == DialogResult.OK) 49 { 50 // OKならファイル名をセット 51 filename = op.FileName; 52 } 53 else if(result == DialogResult.Cancel){ 54 // Cancelならメソッドを抜ける 55 return; 56 } 57 58 // テキストファイル読み込みセット 59 try 60 { 61 // CSVデータ読み込み開始 62 using (StreamReader sr = new StreamReader(filename, Encoding.GetEncoding("Shift_JIS"))) 63 { 64 // ステータスをセット 65 status = 1; 66 // CSVデータの行処理 67 while (!sr.EndOfStream) 68 { 69 // 1行読み込み 70 String line = sr.ReadToEnd(); 71 // 読み込んだデータを配列セット 72 String[] data = line.Split(','); 73 // ステータスセット 74 status = 2; 75 // 保存用構造体の配列を追加 76 Array.Resize(ref da, cnt + 1); 77 // 読み込んだデータを構造体にセット 78 da[cnt] = new DataArray(data[0], int.Parse(data[1]), data[2] 79 , data[3], int.Parse(data[4]), float.Parse(data[5]) 80 , float.Parse(data[6]), data[7]); 81 cnt += 1; 82 } 83 } 84 } 85 // エラー時のメッセージ表示 86 catch(IOException e){ // 実際には入っていますが割愛します } 87 } 88} 89
どのように宣言したらよいか、またClass
を使った方が良いのか、
すいませんが、ご教示くださいますよう、お願い致します。
そもそもなぜ構造体? 構造体と言われた時点で、特にその理由を明確にしてもらわない限り、質問のその先を見る気が失われてしまいます。
とりあえずCSVデータを読み込んで保持するSingletonなクラスを作ってみたらどうでしょう。
https://www.google.co.jp/search?q=C%23+Singleton
何を配列と呼んでるんだろう。
> C言語のように構造体自体に配列を持ち、
構造体のメンバーとして配列を持ち?
その後のコードを見る限り構造体自体を配列にしてるようにしか。
そもそもコレクションクラスの利用を避けて敢えて配列を使う理由がどこにあるんだろう。
C言語はかじったけどC#は基本中の基本すら勉強してないように見える。
「共有」とは何とどのように共有することを指しているのか分からないし、C#でグローバル、というのも謎。C言語でのプログラミングで言うグローバル変数のようにして、他のソースファイルからも自由にアクセスできるような操作を言っているのでしょうか。
少なくとも私には『// 読み込んだデータを構造体にセット』の処理の部分に狂気を感じますね。
今回は 0~7番目までの8つなのでまだいいですが、実務だと普通にデータが100件とかあっても違和感ないです。(たとえば会社レベルでの住所録とか)
それを data[0], data[1], data[2], ... とやるのは狂気を感じるかも?
パターン的に pos + 1 した数字で偶数番号なら intに、それ以外(奇数)ならそのまま文字列として……のようになっているっぽいのでその規則性を使えば楽そうなのに…
(このコードを保守しろと言われたら逃げるかも)
修正: 偶数・奇数で分かれていないっぽい。でも私ならdata[0], data[1], data[2]... とかみたいにはしない。別のクラスにするか、コンストラクタでそのまま引数として配列を受け取り、内部で処理するかとかでしょうね。
それと、C#とかにグローバル変数なんてありません。(やろうと思えばできなくはないが、危険)
そもそもC言語でまともにできるのならグローバル変数でやろうとか思わないはずです。
グローバル変数ってのは相当危険です。
ヒント: https://ameblo.jp/engineertalksc/entry-12122954753.html
競技プログラミングでの動的計画法等のような場合で、あえてグローバル変数を使うとかならいいです。(自分ひとりでやるのが前提なので)
どーーーーーしてもやるなら、他の方も仰っているように、Singletonパターンによる「単一である保証」をするか、publicなフィールド(あるいはプロパティ経由で)としてやるか。
でもかなり危険が伴うのでお勧めしません。
普通は引数や戻り値を使ってやります。
@BeatStarさん
グローバル変数を使うことの良し悪し、危険性を問うている質問ではないので、今、そこの話を拡げてもややこしくなるだけでは。C#ではC言語で言うグローバル変数は無いし、質問で言っている「構造体自体"に"配列」と言っていることと記載の内容がズレているように見えることで、そもそもの質問の前提が曖昧なのでその是正、整理を先にした方が良いと思います。他の方のコメントにもありますが、もともとがC言語での発想で考えていることで話がややこしくなっている気もします。
@ dodox86さん
あー、確かにそうですね。グローバル変数云々の部分は無しでお願いします。
みなさん、いろいろと書き込みありがとうございます。
実はC#は始めたばかりで、勉強中になります。
C言語のようなグローバル変数が無いのを初めてしったくらいなので、
もう少し勉強してから、対処したいと思います。
危険なことは、自分もしたくはありませんので。
シングルトンのところは、少し勉強しておきます。
ありがとうございました。
「勉強」が「検索」のことなら時間の無駄です。
人に尋ねることができないのは言葉を知らないからで、言葉を知らず検索するのは、それより一層難しくなります。
まず入門書から始めて言葉を覚えるところから。
で,結局のところ何の話だったのか? 本件における解決すべき課題点というのは何だったのか?
そういう事柄が問われている段階に見えるが,それに応答することもなく「はいはい,勉強します」で打ち切って終了?
とりあえず質問として機能する形にしとけば相応の回答なり何なりが付くかもしれず,それが「もう少し勉強」するための情報ソースの1つになり得るんじゃない? とか思うのだけど.
皆様、書込みありがとうございます。
今回は自分の言葉知らずから、どのようにやりたいかをうまく伝えきれないので、
改めて出直しした方がよいと判断させてただきました。
即席で覚えた言葉を使っても、余計に混乱を招くと思いますので。
まずはおっしゃる通り、入門から入っていきたいと思います。
その中から得た知識で足りないところでお願いしたいと思います。
この度は本当にもう訳ありません↓。
回答1件
あなたの回答
tips
プレビュー