在c#中实现IEnumerable

  • 本文关键字:IEnumerable 实现 c#
  • 更新时间 :
  • 英文 :


我正在创建一个名为MyDictionary的类,它作为字典类工作,并实现IEnumerable,ICollectionIDictionary等接口。我手动创建了接口,并手动编写了接口中每个方法的功能,除了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的类,不要试图让一个类同时实现IEnumerableIEnumerator

该语言有各种特性,使其更容易使用内置的IEnumerable<T>接口,如foreach循环和迭代器块。因此,从头开始编写自己的IEnumerator是相当罕见的,但是了解它的底层工作原理是值得的。编译器支持一些鸭子类型,所以如果你提供正确的方法,一些语言特性应该可以工作。

我还会注意到,您的ICollection接口看起来像一个队列,与ICollection<T>接口的构建形成对比。我发现一个类既实现字典接口又实现队列接口有点奇怪。

相关内容

  • 没有找到相关文章

最新更新