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

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

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

Re[5]: 似たような処理をまとめたい


(過去ログ 34 を表示中)

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

■16984 / inTopicNo.1)  似たような処理をまとめたい
  
□投稿者/ SAD (3回)-(2008/04/14(Mon) 19:12:09)

分類:[C#] 

VS2005 C#です。
メソッドなど、同じような処理をまとめたく、genericなどを勉強中なのですが、
いまいちつかめません。例えば、

public class Test
{
    public enum LstA_ID
    {
        ID_1,
        ID_2
    }
    public enum LstB_ID
    {
        ID_1,
        ID_2,
        ID_3
    }
    public enum LstC_ID
    {
        ID_1,
        ID_2
    }

    private List<string> _lstA = new List<string>();
    private List<string> _lstB = new List<string>();
    private List<string> _lstC = new List<string>();
}

というクラスを作成します。
このリストからアイテムを取得・設定するためにインデクサを作ります。

public string this[LstA_ID index]
{
    get { return _lstA[(int)index]; }
    set { _lstA[(int)index] = value; }
}

public string this[LstB_ID index]
{
    get { return _lstB[(int)index]; }
    set { _lstB[(int)index] = value; }
}

public string this[LstC_ID index]
{
    get { return _lstC[(int)index]; }
    set { _lstC[(int)index] = value; }
}

これらリストにアイテムが何個入っているか確認できるようにカウントを取得するメソッドを作ります。

public int Count(LstA_ID id)
{
    return _lstA.Count;
}

public int Count(LstB_ID id)
{
    return _lstB.Count;
}

public int Count(LstC_ID id)
{
    return _lstC.Count;
}

これはこれでよいのですが、もう少しシンプルにならないものかと悩んでいます。
上記で_lst変数は、A〜Cの3つですけど、これがA〜Gなどになった場合、
同じようなインデクサを作って、またCountを作って、、としなければなりません。
型が異なる場合はまとめられそうなのですが、これは変数そのものが異なります。
これを上手くまとめる方法はないでしょうか?

引用返信 編集キー/
■16985 / inTopicNo.2)  Re[1]: 似たような処理をまとめたい
□投稿者/ SAD (5回)-(2008/04/14(Mon) 19:28:57)
すみません。再度考えた結果こうなったのですが、これが常套手段でしょうか?

public class Test
{
    List<string> _lst = new List<string>();

    public string this[int index]
    {
        get { return this._lst[index]; }
        set { this._lst[index] = value; }
    }

    public int Count()
    {
        return this._lst.Count;
    }
}

public class Ope
{
    public enum LstA
    {
        ID_1,
        ID_2
    }
    public enum LstB
    {
        ID_1,
        ID_2,
        ID_3
    }
    public enum LstC
    {
        ID_1,
        ID_2
    }

    private Test _lstA = new Test();
    private Test _lstB = new Test();
    private Test _lstC = new Test();

    public void Ope()
    {
        // このままだとエラーになりますが。
        this._lstA[LstA.ID_1];
        this._lstA.Count;
    }
}

引用返信 編集キー/
■16992 / inTopicNo.3)  Re[2]: 似たような処理をまとめたい
□投稿者/ Azulean (68回)-(2008/04/14(Mon) 22:56:34)
目的はなんでしょうか?
勉強のためにクラスを作りたいのか、特定のキーを元に値を取り出したいのか。

後者であればDictionaryがそのまま使えますけれど、やっぱりDictionaryみたいなものを作ることが目的なのかな?

参考
Dictionary<LstA, string> dic = new Dictionary<LstA, string>();
dic.Add(LstA.ID_1, "test");

int count = dic.Count;
string value = dic[LstA.ID_1];


> public int Count()
> {
> return this._lst.Count;
> }
.NET FrameworkではCountはプロパティ(get)として実装されていることが多いと思います。

public int Count
{
get { return this._lst.Count; }
}

引用返信 編集キー/
■17008 / inTopicNo.4)  Re[3]: 似たような処理をまとめたい
□投稿者/ SAD (7回)-(2008/04/15(Tue) 01:56:32)
Azulean様、お忙しい所ありがとうございます。

>勉強のためにクラスを作りたいのか、特定のキーを元に値を取り出したいのか
前者も後者も兼ねています。

・特定のキーで値の出し入れを行う。
・シリアライズ/デシリアライズしてファイル保存、読込みを行う

というのを行う予定です。
今後の展開として

・キー/値の組み合わせは増えることがある。
・private Test _lstA = new Test(); という宣言は、今後B、C..と、増える可能性がある。
 (要するに管理するリストのようなものが増える)

というのを考慮し、保守を容易にできないかなと思っています。
Azulean様のおっしゃる通り、Dictionaryみたいなものを作るのが目的です。
シリアライズできればDictionaryで問題ないのですが・・・。

調べてみると、Dictionaryはシリアライズできない?ようなので、
とりあえず違う手は?という具合で上記のようなものを考えました。

一応、いろいろと参考になる所を探していて、
XNA Game StudioというのがあればDictionaryもシリアライズできちゃうようなことが
書かれていましたが、そんなスゴイものを作るわけでもないので・・・。

@ITさんなんかも見てはいるのですが、
http://www.atmarkit.co.jp/fdotnet/easyxml/index/index.html
IEnumerableを実装する方法でシリアライズ化ができるような記事もある(Dictionaryもできるのかな?)のですが、
まだちょっと覚えきれていません。

方法なんて沢山あるので、自分の好きなようにやればいいのですが、
いまいちベターな方法が浮かんでこなかったので質問してみました。

引用返信 編集キー/
■17009 / inTopicNo.5)  Re[4]: 似たような処理をまとめたい
□投稿者/ Azulean (69回)-(2008/04/15(Tue) 07:39:40)
2008/04/15(Tue) 07:49:06 編集(投稿者)

> 調べてみると、Dictionaryはシリアライズできない?ようなので、
> とりあえず違う手は?という具合で上記のようなものを考えました。
シリアライズできないという表現は不適切です。
XmlSerializerではできませんが、BinaryFormatterではシリアライズできますので。

Dictionary<int, string> test = new Dictionary<int,string>();
test.Add(20, "aaa");
test.Add(15, "bbb");

MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, test);

ms.Seek(0, SeekOrigin.Begin);

Dictionary<int, string> test2 = (Dictionary<int, string>)bf.Deserialize(ms);

> XNA Game StudioというのがあればDictionaryもシリアライズできちゃうようなことが
> 書かれていましたが、そんなスゴイものを作るわけでもないので・・・。
XNA Game StudioとDictionaryは直接の関係はないのでは?

> IEnumerableを実装する方法でシリアライズ化ができるような記事もある(Dictionaryもできるのかな?)のですが、
> まだちょっと覚えきれていません。
Dictionary<TKey, TValue>はIEnumerableが実装されています。

[Serializable]
[ComVisible(false)]
[DebuggerDisplay("Count = {Count}")]
public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValuePair<TKey, TValue>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback

引用返信 編集キー/
■17010 / inTopicNo.6)  Re[4]: 似たような処理をまとめたい
□投稿者/ Azulean (70回)-(2008/04/15(Tue) 07:52:20)
XmlSerializer DictionaryでGoogleで検索。
(言語限定せず)

http://blogs.msdn.com/psheill/archive/2005/04/09/406823.aspx
http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx
引用返信 編集キー/
■17030 / inTopicNo.7)  Re[5]: 似たような処理をまとめたい
□投稿者/ SAD (8回)-(2008/04/15(Tue) 19:12:41)
Azulean様
わざわざ探していただきありがとうございます。
そういえば検索するとき、常に「日本語」にしていました。
前者のサイトにあるものを改造したところ、思うように動作し、
自分で考えていたものよりも保守が容易になりそうです。
ただ、今やろうとしていることよりも、もう少しシリアライズやコレクション、
インターフェースのことを勉強したくなりました。
動作したソースを載せるべきなのでしょうが、サイトにあるソースを流用し、
ファイル読み込み、保存させているだけですので、載せるほどでもないのでやめておきます。
いろいろと手ほどきありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -