我正在创建一个名为MyDictionary
的类,它作为字典类工作,并实现IEnumerable
,ICollection
和IDictionary
等接口。我手动创建了接口,并手动编写了接口中每个方法的功能,除了IEnumerable
,我想不出我可以为IEnumerable
接口实现什么方法,有人能告诉我我可以为我正在工作的类实现什么方法吗?
代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
namespace lab3
{
interface ICollection
{
int Count { get; }
int enqueue(object value);
void dequeue(object value);
//void CopyTo(Array array, int index);
}
interface IEnumerable
{
IEnumerator GetEnumerator();
}
interface IDictionary
{
bool Contains(object key);
Boolean TryGetIndexOfKey(Object key, out Int32 index);
void Remove(object key);
void Add(object key, object value);
}
class MyDictionary : IEnumerable, IDictionary, ICollection
{
private DictionaryEntry[] items;
private Int32 ItemsInUse = 0;
Int32 index = -1;
public MyDictionary(Int32 numItems)
{
items = new DictionaryEntry[numItems];
}
public bool Contains(object key)
{
Int32 index;
return TryGetIndexOfKey(key, out index);
}
public Boolean TryGetIndexOfKey(Object key, out Int32 index)
{
for (index = 0; index < ItemsInUse; index++)
{
// If the key is found, return true (the index is also returned).
if (items[index].Key.Equals(key)) return true;
}
// Key not found, return false (index should be ignored by the caller).
return false;
}
public void Add(object key, object value)
{
// Add the new key/value pair even if this key already exists in the dictionary.
if (ItemsInUse == items.Length)
throw new InvalidOperationException("The dictionary cannot hold any more items.");
items[ItemsInUse++] = new DictionaryEntry(key, value);
}
public void Remove(object key)
{
if (key == null) throw new ArgumentNullException("key");
// Try to find the key in the DictionaryEntry array
Int32 index;
if (TryGetIndexOfKey(key, out index))
{
// If the key is found, slide all the items up.
Array.Copy(items, index + 1, items, index, ItemsInUse - index - 1);
ItemsInUse--;
}
else
{
// If the key is not in the dictionary, just return.
}
}
public int Count { get { return ItemsInUse; } }
public void dequeue(object value)
{
}
public int enqueue(object value)
{
return -1;
}
GetEnumerator()
{
// Construct and return an enumerator.
return (IEnumerator) GetEnumerator();
}
}
class Program
{
static void Main(string[] args)
{
dictionary.Add("Mohammed", 21);
dictionary.Remove("Mohammed");
Console.WriteLine("Number of elements in dictionary = {0}", dictionary.Count);
Console.WriteLine("Does dictionary contain 'Mohammed'? {0}",
dictionary.Contains("Mohammed"));
}
}
}
典型的IEnumerable
接口只有一个返回IEnumerator
的方法,就像你的例子一样。
您不定义IEnumerator
接口,但它通常看起来像这样
interface IMyEnumerator{
bool MoveNext();
object Current {get;}
}
例如,这个接口的实现可以包含一个数组和一个索引。MoveNext()
对索引进行递增,如果当前索引小于数组长度则返回true。Current
将只返回索引的数组值。请注意,这应该是一个独立于MyDictionary
的类,不要试图让一个类同时实现IEnumerable
和IEnumerator
。
该语言有各种特性,使其更容易使用内置的IEnumerable<T>
接口,如foreach循环和迭代器块。因此,从头开始编写自己的IEnumerator是相当罕见的,但是了解它的底层工作原理是值得的。编译器支持一些鸭子类型,所以如果你提供正确的方法,一些语言特性应该可以工作。
我还会注意到,您的ICollection
接口看起来像一个队列,与ICollection<T>
接口的构建形成对比。我发现一个类既实现字典接口又实现队列接口有点奇怪。