Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中作为索引器的字符串#_C#_String_Indexer - Fatal编程技术网

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

C# C中作为索引器的字符串#,c#,string,indexer,C#,String,Indexer,让我首先展示代码: 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] = (obje

让我首先展示代码:

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
    }
}

我正在做这个教程,class
Program
已经给了我,我不能修改它。我需要做的是创建
Collection
类,所以
Collection
类是我自己创建的。但是
索引器
有这个问题,因为它是
字符串
,它的工作方式似乎与前面教程中整数索引器的工作方式不同。有没有使用字符串作为索引器的方法,或者我应该考虑不同的方法吗?此外,不允许添加名称空间。我已经在本教程中学习了一周了。

您可以使用字典集:

Dictionary<string, object> dict = new Dictionary<string, object>();
dict["hello"] = "world";
Dictionary dict=new Dictionary();
dict[“你好”]=“世界”;

您可以使用下面的类。检查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);
            }
        }
    }
} 
类集合
{
字典值=新字典();
公共对象[字符串索引]
{
收到
{
if(值.ContainsKey(索引)
{
返回值[索引];
}
返回null;
}
设置
{
如果(!values.ContainsKey(索引)
{
添加(索引、值);
}
}
}
} 

作为向正确方向指引的提示,(您正在学习,所以我不想泄露它>让集合存储两个数组,一个
对象[]
字符串[]
。看看这是否让您走上了正确的方向

如果您需要进一步的提示,请遵循

您需要将字符串名称存储在
string[]
中,与将对象存储在
object[]
中的索引相同。然后,如果调用
var intIndex=Array.IndexOf(stringCollection,index)
,则可以将其结果用作
返回值[intIndex]


看看你是否可以在不遵循链接的情况下找到答案,或者先看上面的扰流板文字!

不使用字典

这存储对象数组和字符串数组。字符串数组用作索引器,对象数组用作值。键和值存储在各自数组中的同一位置

这里有很多优化和改进…但这应该是一个起点

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++;
            }
        }
    }
}
类集合
{
整数大小;
国际项目;
字符串[]键;
对象[]值;
公共集合(整数大小)
{
键=新字符串[大小];
值=新对象[大小];
这个。大小=大小;
项目=0;
}
公共对象[字符串索引]
{
收到
{
int位置=-1;
对于(int i=0;i
您可以使用以下方法,与您提到的方法稍有不同,但效果很好

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"]);
        }
    }
}

字典不需要添加名称空间吗?@RohitMalish是的,所以你的学习练习会失败。但是,如果你想在哪里做这个“正常”没有字典约束的方式将是正确的答案。您只需使用以下语句编写:using System.Collections.Generic;在名称空间部分上方。或者显式编写名称空间:System.Collections.Generic.Dictionary dict;您(以及对此进行投票的人)不理解注释“不允许添加名称空间”.本教程旨在教他创建自己的字符串索引器,是的,在正常环境下,字典是正确的方法,但对于“如何教某人如何编写自己的字符串索引器”的回答是错误的事实上,我发现我可以以这种形式使用它:System.Collections.Generic.Dictionary。因为你是第一个回答的,所以我接受你的回答。谢谢!这是一个恰当的评论,但不是一个答案。@Servy我给出了一个完整的解决方案,我不想只告诉他答案,而是按照MSDN链接和说明来回答ns我给出的是一个完整的答案。关于SO的答案需要是独立的。它应该回答这个问题,而不要求读者遵循任何链接。这并不是说我认为你应该为他们做这个人的工作,只是因为你不是,所以你不应该把它作为答案发布。@Servy,你去吧,我和to去
meta
要了解如何添加spoiler text.OP,他声明不能使用对其他库的引用,例如System.Collections.Great solution!感谢如果索引已经存在:集合不一定会消耗一个额外的数组元素。此外,您也不必检查是否还有其他元素的空间。