- PR -

ArrayListのオブジェクトの指定方法について

投稿者投稿内容
n2
会議室デビュー日: 2005/02/21
投稿数: 4
投稿日時: 2005-02-21 21:08
お世話になっております。
早速質問させていただきたいと思います。

共通的に使用する、あるクラスを作成しており
その引数にArrayListを使いたいという話なのですが
ArrayListの要素の変数名がわからない状態で値を取得することが
できるのでしょうか?

レコードとカラムという言い方をするとレコード単位はインデクスで
指定できるようですが、カラム単位では出来るのがわからないのです。

2次元配列ならばその心配はいらないのではないかとも思うのですが・・・


サンプル----------------------------------------------------
using System;
using System.Collections;

namespace Test1
{
public class List
{
public string s1;
public string s2;

public List(string ss1, string ss2)
{
s1 = ss1;
s2 = ss2;
}
}

{
[STAThread]
static void Main()
{
ArrayList myArrayList = new ArrayList();

myArrayList.Add(new List("abc","def"));
myArrayList.Add(new List("ghi","jkl"));

foreach(List list in myArrayList)
{
Console.WriteLine("{0}{1}",list.s1,list.s2);
}                 ↑ ↑
}              例えばこのような場合で変数名でなく
}                要素のように番号指定をしたいと思っています
}


うまく説明出来ていませんが、よろしくお願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-02-22 00:38
list[0]のようにアクセスしたいならインデクサとして実装する必要があります。
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_012/cs2_012_02.html
という話ではない?

この場合「要素のように番号指定をしたい」のはlistですか?s1やs2ですか?

「引数にArrayListを使いたい」では、どこの引数がArrayListなのですか?

myArrayList[0] のようには上記のコードの場合でもアクセス可能ですよね。
ArrayListで2次元配列のようなことをしたいのですか?なら下記のように
ArrayListにArrayListをaddする感じですかね。

ArrayList myArrayList = new ArrayList();
ArrayList list1 = new ArrayList();
myArrayList.Add(list1);
list1.Add(new List("abc", "def"));

参照時はキャストが必要です(foreachしたいなら2重ループ)
((List)((ArrayList)myArrayList[0])[0]).s1
Fujiwo
常連さん
会議室デビュー日: 2002/02/19
投稿数: 20
投稿日時: 2005-02-22 11:12
> Console.WriteLine("{0}{1}",list.s1,list.s2);

確認ですけれど、list.s1、list.s2 でなく、list[0]、list[1] のようにアクセスしたい、ということですよね。
だとしたら、List クラスにインデクサを用意してやれば O.K. です。

>共通的に使用する、あるクラスを作成しており
>その引数にArrayListを使いたいという話なのですが
>ArrayListの要素の変数名がわからない状態で値を取得することが
>できるのでしょうか?

上記のように、「list.s1、list.s2 でなく、list[0]、list[1] のようにアクセスしたい」ということであれば、ArrayList は関係ありません。
「ArrayListの要素の変数名がわからない状態で値を取得する」という問題ではありません。
# 問題を解く場合は、先ずは、問題を明確にすべきだと思います。
n2
会議室デビュー日: 2005/02/21
投稿数: 4
投稿日時: 2005-02-22 11:43
ご返答ありがとうございます。
サンプルのインデントが出来ておらず見にくくて申し訳ありません。
矢印は s1,s2 を指しておりました。

番号指定をしたいものは s1,s2 です。
つまり、このサンプルの場合・・・
Console.WriteLineのところでlist[0]とするとs1を指し、
list[1]とするとs2を指すようなイメージで考えております。
サンプルでは変数名を指定すると問題ないと思いますが
共通で使用する場合はmyArrayListの中に何が入っているのかわからないので
番号で指定できないものかというのが質問の趣旨でした。

参考のページを見たのですが、自分のものに適用するとどのような
コーディングになるのかいまひとつ解りませんでした。
お手数ですが、ご教授願います。
Fujiwo
常連さん
会議室デビュー日: 2002/02/19
投稿数: 20
投稿日時: 2005-02-22 11:53
>参考のページを見たのですが、自分のものに適用するとどのような
>コーディングになるのかいまひとつ解りませんでした。
>お手数ですが、ご教授願います。

どういう風にやってみられて、どこでどういう風にお判りでなかったのでしょうか。
Fujiwo
常連さん
会議室デビュー日: 2002/02/19
投稿数: 20
投稿日時: 2005-02-22 12:01
>サンプルでは変数名を指定すると問題ないと思いますが
>共通で使用する場合はmyArrayListの中に何が入っているのかわからないので
>番号で指定できないものかというのが質問の趣旨でした。

myArrayList に入っているものは不明だということですね。
だとすると、べる さん がおっしゃるように、ArrayList の ArrayList にする方法ではまずいのでしょうか。
n2
会議室デビュー日: 2005/02/21
投稿数: 4
投稿日時: 2005-02-22 15:00
どうもありがとうございました。
お2人のおっしゃる通り、ArrayList の ArrayList を使うことで
変数を指定せずに値を取得することが出来ました。

たいへん参考になりました!
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2005-02-22 17:42
ありゃ?解決してる(^^;
参考までに、インデクサはこんな感じです。

コード:
public class List 
{ 
    private string s1; 
    private string s2; 

    public List(string ss1, string ss2) 
    { 
        s1 = ss1; 
        s2 = ss2; 
    }

    public string this[int index]
    {
        get {
            switch(index) {
                case 0:
                    return s1;
                case 1:
                    return s2;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
        set {
            switch(index) {
                case 0:
                    s1 = value;
                    break;
                case 1:
                    s2 = value;
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }
    }
} 


個人的には、インデックスでも名前でもアクセスできるDataTableがお気に入りです。が、二重ArrayListで事足りるならそれで十分でしょう。
#自分で定義書かなくていいし。

余談ですが、C#のswitch文はbreak書かないとコンパイラに怒られるんですね。VB.NETで作ったモジュールとの互換性のためでしょうか?

スキルアップ/キャリアアップ(JOB@IT)