0

コードを示すことから始めましょう。

public class Collection
{
    private object[] values;

    public Collection(int size) => values = new object[size];

    public object this[string index] 
    { 
        get => values[index]; 
        set => values[index] = (object)value;
    }
} 
public class Program
{
    private static void Main()
    {
        Collection collection = new Collection(3);
        collection["integer"] = 123;
        collection["decimal"] = 456.78;
        collection["text"]    = "Hello World!";

        double total = (double)(int)collection["integer"] + (double)collection["decimal"];
        Console.WriteLine("Total is {0}", total);

        Console.WriteLine();

        Collection collection2 = new Collection(2);
        collection2["integer"] = 123;
        collection2["decimal"] = 456.78;
        collection2["text"]    = "Hello World!"; // This wont be added because of limit
    }
}

私はこのチュートリアルを行っていますが、クラスProgramは既に与えられており、変更できません。私がする必要があるのはCollectionクラスを作成することなので、Collectionクラスは私が作成します。しかし、以前のチュートリアルで整数インデクサーが機能したのと同じように機能しないように見えるIndexerため、にはこの問題があります。string文字列をインデクサーとして使用する方法はありますか、または別のアプローチを検討する必要がありますか? 名前空間の追加も許可されていません。このチュートリアルで 1 週間立ち往生しています。

4

5 に答える 5

3

Dictionary コレクションを使用できます。

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["hello"] = "world";
于 2013-08-12T18:16:14.680 に答える
3

正しい方向に向けるためのヒントとして、(あなたは学んでいるので、私はそれを手放したくありません> Collection に aobject[]との 2 つの配列を格納してもらいstring[]ます。それが正しい方向に進むかどうかを確認してください。

さらにヒントが必要な場合は、このリンクをたどってください。

string[]にオブジェクトを格納するのと同じインデックスに、文字列名を格納する必要がありますobject[]。次に、呼び出すvar intIndex = Array.IndexOf(stringCollection, index)と、その結果を次のように使用できますreturn values[intIndex]

リンクをたどったり、上記のネタバレテキストを見たりせずに理解できるかどうかを確認してください!

于 2013-08-12T18:22:33.513 に答える
1

辞書を使わずに...

これは、オブジェクト配列と文字列配列を格納します。文字列配列はインデクサーとして使用され、オブジェクト配列は値として使用されます。キーと値は、それぞれの配列の同じ場所に格納されます。

ここには最適化と改善がたくさんあります...しかし、それは出発点であるべきです。

class Collection
{
    int size;
    int items;
    string[] keys;
    object[] values;

    public Collection(int size)
    {
        keys = new string[size];
        values = new object[size];
        this.size = size;
        items = 0;
    }

    public object this[string index]
    {
        get
        {
            int position = -1;
            for (int i = 0; i < size ; i++)
                if (keys[i] == index)
                    position = i;

            if (position == -1)
                throw new ArgumentException("Index Not Found");

            return values[position];                
        }
        set
        {
            int position = -1;
            for (int i = 0; i < size; i++)
                if (keys[i] != null && keys[i] == index)
                    position = i;

            if (position != -1)
            {
                values[position] = value;
            }
            else
            {
                if (items == size)
                    throw new Exception("Collection full");

                keys[items] = index;
                values[items] = value;
                items++;
            }
        }
    }
}
于 2013-08-12T18:35:06.170 に答える
0

以下のようにクラスを使用できます。ContainsKey を確認することをお勧めします

class Collection
{

    Dictionary<string, object> values = new Dictionary<string, object>();

    public object this[string index]
    {
        get
        {
            if(values.ContainsKey(index)
            {
              return values[index];
            }
            return null;
        }
        set
        {
            if(!values.ContainsKey(index)
            {
              values.Add(index, value);
            }
        }
    }
} 
于 2013-08-12T18:21:19.117 に答える