C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 構造体へのデータの渡し方


(過去ログ 101 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■59980 / inTopicNo.1)  構造体へのデータの渡し方
  
□投稿者/ 裕猫 (222回)-(2011/06/14(Tue) 18:44:35)

分類:[C#] 

開発環境
OS: WindowsXP SP3
言語: VisualStudio2008 C#

いつもお世話になっています。裕猫です。
 構造体を使うことになりました。以前テキストボックスに順次データを代入するのにうまくループで処理できないかということでよい方法を教えてもらったので
たぶん構造体にもあるだろうと、いろいろ調べているのですがなかなかやりたいことにたどり着けませんのでお力をお借りしたい次第です。
    public class Kozo
    {
        public struct Busho
        {
            public string ID;
            public string Mei;
        }
    }
をDBS.DLLの中で定義してあります。
namespace 構造体
{
    public partial class Form1 : Form
    {
        private Kozo.Busho ss = new Kozo.Busho();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
                 ss.ID = EM20OLD[0].ToString();
                ss.Mei = EM20OLD[1].ToString();
        }
    }
}
メインでボタンを押したときEM20OLDのオブジェクトを順番にループで構造体に渡したいわけですがどう書いたらよいのかわかりません。
        private void button1_Click(object sender, EventArgs e)
        {
                 for (int count=0; count < EM20OLD.length; count++)
		{
                  ss.xxxx=EM20OLD[count].Tostring();
		}
        }
という感じにしたいのですがどうしたらよいでしょう?ご教授いただけないでしょうか?サンプルは2項目ですが実装は50項目くらいあるので何とかしたいです。
   よろしくお願いいたします。

引用返信 編集キー/
■59981 / inTopicNo.2)  Re[1]: 構造体へのデータの渡し方
□投稿者/ 魔界の仮面弁士 (2219回)-(2011/06/14(Tue) 19:32:11)
No59980 (裕猫 さん) に返信
>  構造体を使うことになりました。
構造体で管理しなければダメですか?

たとえば、System.Collections.Specialized.NameValueCollection クラスで管理すれば、
  // 初期定義
  foo = new NameValueCollection();
  foo.Add("ID", null);
  foo.Add("Mei", null);

  // 名前指定で読み書き
  foo["ID"]  = EM20OLD[0].Tostring();
  foo["Mei"] = EM20OLD[1].Tostring();
  string id = foo["ID"];

  // インデックス指定で読み書き
  foo[foo.Keys[1]] = EM20OLD[1].Tostring();
  string mei = foo[1];
のような記述が可能です。


また、複数のレコードとして管理したいような場合は
System.Data.DataTable を使うのも手です。


たとえば、型付 DataSet な DataTable 等で管理するようにすれば、
 row.ID   = EM20OLD[0].Tostring();
 row.Name = EM20OLD[1].Tostring();
のような書き方や、
 row["ID"]   = EM20OLD[0].Tostring();
 row["Name"] = EM20OLD[1].Tostring();
な書き方や
 row[0] = EM20OLD[0].Tostring();
 row[1] = EM20OLD[1].Tostring();
な書き方が行えるため、ループ処理もやりやすいかと思います。



> たぶん構造体にもあるだろうと、いろいろ調べているのですが
最終手段としては、リフレクションという手もありますけれどね。

// using System.Reflection;

Type t = typeof(Kozo.Busho);
FieldInfo[] f = t.GetFields();

object o = ss;
f[0].SetValue(o, EM20OLD[0].ToString());
f[1].SetValue(o, EM20OLD[1].ToString());
ss = (Kozo.Busho)o;

引用返信 編集キー/
■59990 / inTopicNo.3)  Re[2]: 構造体へのデータの渡し方
□投稿者/ Azulean (764回)-(2011/06/14(Tue) 23:02:27)
50 個もあると、構造体としなければならない理由がよくわからないというのが正直な感想です。
(型のデザインガイドからすると、サイズ的にクラスを採るところです)

構造体を選択した理由は何でしょうか?
名前のついていない配列ベースで扱うのが嫌?既存の資産(ネイティブ DLL など)が構造体を要求している?

理由を明らかにしておくと、それについてアドバイスがもらえるかもしれません。
引用返信 編集キー/
■59992 / inTopicNo.4)  Re[3]: 構造体へのデータの渡し方
□投稿者/ 裕猫 (223回)-(2011/06/15(Wed) 08:54:33)
No59990 (Azulean さん) に返信
> 50 個もあると、構造体としなければならない理由がよくわからないというのが正直な感想です。
> (型のデザインガイドからすると、サイズ的にクラスを採るところです)
>
> 構造体を選択した理由は何でしょうか?
> 名前のついていない配列ベースで扱うのが嫌?既存の資産(ネイティブ DLL など)が構造体を要求している?
>
> 理由を明らかにしておくと、それについてアドバイスがもらえるかもしれません。
返信ありがとうございます。理由は
 メニューから数十個のプログラムを呼び出して動く業務システムを作っています。たとえばa,b,cの三つのプログラムで商品というデータベースのテーブルのデータを使ってそれぞれ違う処理をするのですが、abc全てで使うデータベースのテーブルのカラムもあれば単独で使うカラムもあります。でここでdというプログラムを追加したときテーブルの構造を変える必要が出ることがあります。入れるデータが中間位置のものだとそれ以降のデータの位置が1つずつずれてしまうのでabcのプログラム全てを修正しなければならないことになり大変です。で構造体を使えば構造体の構成を変えるだけでabcdの中身は修正しなくてもすむなと考えたわけです。

 いま返信書いている途中で思いついたけどSQL文で必要なカラムのデータだけ取り出すやり方がありましたね。それを使えばやりたいことができるかもしれないですね。試してみようと思います。
引用返信 編集キー/
■59995 / inTopicNo.5)  Re[2]: 構造体へのデータの渡し方
□投稿者/ 裕猫 (224回)-(2011/06/15(Wed) 09:02:33)
No59981 (魔界の仮面弁士 さん) に返信
> 構造体で管理しなければダメですか?
別の方法があれば使わなくてもいいです。使い方はAzuleanさんへの返信を見てください。

> たとえば、System.Collections.Specialized.NameValueCollection クラスで管理すれば、
> // 初期定義
> foo = new NameValueCollection();
> foo.Add("ID", null);
> foo.Add("Mei", null);
>
> // 名前指定で読み書き
> foo["ID"] = EM20OLD[0].Tostring();
> foo["Mei"] = EM20OLD[1].Tostring();
> string id = foo["ID"];
>
> // インデックス指定で読み書き
> foo[foo.Keys[1]] = EM20OLD[1].Tostring();
> string mei = foo[1];
> のような記述が可能です。
>
>
> また、複数のレコードとして管理したいような場合は
> System.Data.DataTable を使うのも手です。
>
>
> たとえば、型付 DataSet な DataTable 等で管理するようにすれば、
>  row.ID = EM20OLD[0].Tostring();
>  row.Name = EM20OLD[1].Tostring();
> のような書き方や、
>  row["ID"] = EM20OLD[0].Tostring();
>  row["Name"] = EM20OLD[1].Tostring();
> な書き方や
>  row[0] = EM20OLD[0].Tostring();
>  row[1] = EM20OLD[1].Tostring();
> な書き方が行えるため、ループ処理もやりやすいかと思います。
>
>
>
>>たぶん構造体にもあるだろうと、いろいろ調べているのですが
> 最終手段としては、リフレクションという手もありますけれどね。
>
> // using System.Reflection;
>
> Type t = typeof(Kozo.Busho);
> FieldInfo[] f = t.GetFields();
>
> object o = ss;
> f[0].SetValue(o, EM20OLD[0].ToString());
> f[1].SetValue(o, EM20OLD[1].ToString());
> ss = (Kozo.Busho)o;
いつもありがとうございます。早速試してみます。ありがとうございました。
引用返信 編集キー/
■60000 / inTopicNo.6)  Re[2]: 構造体へのデータの渡し方
□投稿者/ 裕猫 (225回)-(2011/06/15(Wed) 11:31:16)
No59981 (魔界の仮面弁士 さん) に返信
> たとえば、System.Collections.Specialized.NameValueCollection クラスで管理すれば、
この方法で希望どうりの動作をさせることができました。構造体ってあまり使い道がないですかね?
おかげさまでプログラムもかなりすっきりできました。ありがとうございました。
引用返信 編集キー/
■60001 / inTopicNo.7)  Re[3]: 構造体へのデータの渡し方
□投稿者/ 裕猫 (226回)-(2011/06/15(Wed) 11:32:02)
チェックつけわすれました。
解決済み
引用返信 編集キー/
■60003 / inTopicNo.8)  Re[3]: 構造体へのデータの渡し方
□投稿者/ 魔界の仮面弁士 (2223回)-(2011/06/15(Wed) 13:03:48)
No60000 (裕猫 さん) に返信
> 構造体ってあまり使い道がないですかね?

使い道はあるでしょう。
int や System.Point は構造体です。普段から利用していますよね。


クラスと構造体の使い分けなどについて、下記を参照してみてください。
http://msdn.microsoft.com/ja-jp/library/ms229036.aspx


構造体は、軽量のオブジェクト(Point、Rectangle、Color など)を表すのに適しています。
しかし今回のように、大量のメンバーを含んだものには適しません。
引用返信 編集キー/
■60020 / inTopicNo.9)  Re[4]: 構造体へのデータの渡し方
□投稿者/ 裕猫 (227回)-(2011/06/15(Wed) 17:13:56)
No60003 (魔界の仮面弁士 さん) に返信
> ■No60000 (裕猫 さん) に返信
>>構造体ってあまり使い道がないですかね?
>
> 使い道はあるでしょう。
> int や System.Point は構造体です。普段から利用していますよね。
>
>
> クラスと構造体の使い分けなどについて、下記を参照してみてください。
> http://msdn.microsoft.com/ja-jp/library/ms229036.aspx
>
>
> 構造体は、軽量のオブジェクト(Point、Rectangle、Color など)を表すのに適しています。
> しかし今回のように、大量のメンバーを含んだものには適しません。
勉強になりました。ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -