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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1386閲覧

C#で構造体に配列をセットした状態で共有したい

HYDESA

総合スコア8

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/11/18 09:00

前提・実現したいこと

いつもお世話になっています。
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を使った方が良いのか、
すいませんが、ご教示くださいますよう、お願い致します。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/11/18 09:04

そもそもなぜ構造体? 構造体と言われた時点で、特にその理由を明確にしてもらわない限り、質問のその先を見る気が失われてしまいます。
Zuishin

2021/11/18 09:20

何を配列と呼んでるんだろう。 > C言語のように構造体自体に配列を持ち、 構造体のメンバーとして配列を持ち? その後のコードを見る限り構造体自体を配列にしてるようにしか。
gentaro

2021/11/18 09:32 編集

そもそもコレクションクラスの利用を避けて敢えて配列を使う理由がどこにあるんだろう。 C言語はかじったけどC#は基本中の基本すら勉強してないように見える。
dodox86

2021/11/18 09:48

「共有」とは何とどのように共有することを指しているのか分からないし、C#でグローバル、というのも謎。C言語でのプログラミングで言うグローバル変数のようにして、他のソースファイルからも自由にアクセスできるような操作を言っているのでしょうか。
BeatStar

2021/11/18 09:53 編集

少なくとも私には『// 読み込んだデータを構造体にセット』の処理の部分に狂気を感じますね。 今回は 0~7番目までの8つなのでまだいいですが、実務だと普通にデータが100件とかあっても違和感ないです。(たとえば会社レベルでの住所録とか) それを data[0], data[1], data[2], ... とやるのは狂気を感じるかも? パターン的に pos + 1 した数字で偶数番号なら intに、それ以外(奇数)ならそのまま文字列として……のようになっているっぽいのでその規則性を使えば楽そうなのに… (このコードを保守しろと言われたら逃げるかも) 修正: 偶数・奇数で分かれていないっぽい。でも私ならdata[0], data[1], data[2]... とかみたいにはしない。別のクラスにするか、コンストラクタでそのまま引数として配列を受け取り、内部で処理するかとかでしょうね。
BeatStar

2021/11/18 09:59 編集

それと、C#とかにグローバル変数なんてありません。(やろうと思えばできなくはないが、危険) そもそもC言語でまともにできるのならグローバル変数でやろうとか思わないはずです。 グローバル変数ってのは相当危険です。 ヒント: https://ameblo.jp/engineertalksc/entry-12122954753.html 競技プログラミングでの動的計画法等のような場合で、あえてグローバル変数を使うとかならいいです。(自分ひとりでやるのが前提なので) どーーーーーしてもやるなら、他の方も仰っているように、Singletonパターンによる「単一である保証」をするか、publicなフィールド(あるいはプロパティ経由で)としてやるか。 でもかなり危険が伴うのでお勧めしません。 普通は引数や戻り値を使ってやります。
dodox86

2021/11/18 10:16

@BeatStarさん グローバル変数を使うことの良し悪し、危険性を問うている質問ではないので、今、そこの話を拡げてもややこしくなるだけでは。C#ではC言語で言うグローバル変数は無いし、質問で言っている「構造体自体"に"配列」と言っていることと記載の内容がズレているように見えることで、そもそもの質問の前提が曖昧なのでその是正、整理を先にした方が良いと思います。他の方のコメントにもありますが、もともとがC言語での発想で考えていることで話がややこしくなっている気もします。
BeatStar

2021/11/18 10:28 編集

@ dodox86さん あー、確かにそうですね。グローバル変数云々の部分は無しでお願いします。
HYDESA

2021/11/18 23:54

みなさん、いろいろと書き込みありがとうございます。 実はC#は始めたばかりで、勉強中になります。 C言語のようなグローバル変数が無いのを初めてしったくらいなので、 もう少し勉強してから、対処したいと思います。 危険なことは、自分もしたくはありませんので。 シングルトンのところは、少し勉強しておきます。 ありがとうございました。
Zuishin

2021/11/19 00:49 編集

「勉強」が「検索」のことなら時間の無駄です。 人に尋ねることができないのは言葉を知らないからで、言葉を知らず検索するのは、それより一層難しくなります。 まず入門書から始めて言葉を覚えるところから。
fana

2021/11/19 02:01

で,結局のところ何の話だったのか? 本件における解決すべき課題点というのは何だったのか? そういう事柄が問われている段階に見えるが,それに応答することもなく「はいはい,勉強します」で打ち切って終了? とりあえず質問として機能する形にしとけば相応の回答なり何なりが付くかもしれず,それが「もう少し勉強」するための情報ソースの1つになり得るんじゃない? とか思うのだけど.
HYDESA

2021/11/19 03:14

皆様、書込みありがとうございます。 今回は自分の言葉知らずから、どのようにやりたいかをうまく伝えきれないので、 改めて出直しした方がよいと判断させてただきました。 即席で覚えた言葉を使っても、余計に混乱を招くと思いますので。 まずはおっしゃる通り、入門から入っていきたいと思います。 その中から得た知識で足りないところでお願いしたいと思います。 この度は本当にもう訳ありません↓。
guest

回答1

0

自己解決

もう少し勉強してから対処いたします。
いろいろとありがとうございました。

投稿2021/11/18 23:54

HYDESA

総合スコア8

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

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

dodox86

2021/11/19 00:58

「C言語におけるグローバル変数」と私自身、そう書きましたが、プログラミング言語自体に「グローバル変数」という定義、仕様がある訳ではなく、単に変数の「可視範囲(スコープ)」の問題です。C#で言えばそれに加えてアクセス修飾子を充分に理解するのが大切でしょうか。 [アクセス修飾子 (C# リファレンス)] https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/access-modifiers 構造体(structure)もC#では使うことは少ないので、C言語の知識に惑わされることなく、C#の基本を学ぶことが大事でしょう。
HYDESA

2021/11/19 03:17

dodox86さん、書込みありがとうございます。 おっしゃる通り、C#の基本とセオリーをしっかりと理解したいと思います。 C#の用語のフォローもくださり、ご親切にありがとうございました。 また機会がありましたら、よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問