字符串作为C#中的索引器

时间:2013-08-12 18:12:47

标签: c# string indexer

首先让我展示代码:

using System;

namespace TutorialAdvanced
{
    class Collection
    {

        object[] values;

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

        public object this[string index]
        {
            get
            {
                return values[index];
            }
            set
            {
                values[index] = (object)value;
            }
        }
    } 

    class Program
    {
        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似乎与整数索引器在以前的教程中的工作方式不同。有没有办法使用字符串作为索引器,还是应该考虑不同的方法?也不允许添加名称空间。我已经被困在这个教程中一个星期了。

5 个答案:

答案 0 :(得分:3)

您可以使用词典集合:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["hello"] = "world";

答案 1 :(得分:3)

作为一个指示你正确方向的提示,(你正在学习,所以我不想放弃它&gt;让Collection存储两个数组,object[]string[]。看看是否这会让你朝着正确的方向前进。

如果您需要进一步提示,请按this link

  

您需要将string[]中的字符串名称存储在object[]中存储对象的同一索引中。然后,如果您拨打var intIndex = Array.IndexOf(stringCollection, index),则可以将其结果用作return values[intIndex];

看看你是否可以在不关注链接的情况下弄明白,或者先查看上面的剧透文字!

答案 2 :(得分: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++;
            }
        }
    }
}

答案 3 :(得分: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);
            }
        }
    }
} 

答案 4 :(得分:0)

您可以使用以下方法,该方法与您提到的方法稍有不同,但是效果很好。

using System;

namespace ass5
{
    class Session
    {

        string[] values;
        string[] key;
        int i=0;

        public Session(int size)
        {
            values = new string[size];
            key=new string[size];
        }

        public string this[string index]
        {
            get
            {
                
               // i++;
                int intIndex = Array.IndexOf(key, index);

                if(intIndex==-1)
               {
                   return " error";
               }
                
                return values[intIndex];
            }
            set
            {
               key[i]=index; // for index string storage
               i++;
               int intIndex= Array.IndexOf(key, index);
               
               values[intIndex] = value; // for value corresponding to that index
            }
        }
    } 

    class Program
    {
        static void Main(string[] args)
        {
            Session session=new Session(5);
            session["username"]="user";
            session["password"]="password"; 
            Console.WriteLine(session["username"]);
        }
    }
}