首先让我展示代码:
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
似乎与整数索引器在以前的教程中的工作方式不同。有没有办法使用字符串作为索引器,还是应该考虑不同的方法?也不允许添加名称空间。我已经被困在这个教程中一个星期了。
答案 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"]);
}
}
}