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工作方式似乎与之前教程中整数索引器的工作方式不同。有没有办法使用字符串作为索引器,或者我应该考虑不同的方法?也不允许添加命名空间。我已经在本教程中停留了一周。

4

5 回答 5

3

作为指向正确方向的提示,(您正在学习,所以我不想放弃它>让 Collection 存储两个数组 aobject[]string[]。看看这是否能让您朝着正确的方向前进。

如果您需要进一步的提示,请点击此链接

您需要将字符串名称存储在string[]您将对象存储在object[]. 然后,如果您致电var intIndex = Array.IndexOf(stringCollection, index),则可以将其结果用作return values[intIndex];

看看你是否可以在不点击链接的情况下弄清楚它,或者先看看上面的剧透文字!

于 2013-08-12T18:22:33.513 回答
3

您可以使用 Dictionary 集合:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["hello"] = "world";
于 2013-08-12T18:16:14.680 回答
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 回答
1

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

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"]);
        }
    }
}
于 2020-08-27T10:01:03.763 回答
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 回答