无法将“SZArrayEnumerator”类型的对象强制转换为“System.Collections.Generic.IEnumerator”1[System.String]”

use*_*383 6 c# linq generics

我正在使用给定的接口编写一个哈希表,但我收到错误,如标题所示

return (IEnumerator<Key>)items.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

 foreach (String first in ht);
Run Code Online (Sandbox Code Playgroud)

整个代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace RIT_CS
{

public class NonExistentKey<Key> : Exception
{

    public Key BadKey { get; private set; }

    public NonExistentKey(Key k) :
        base("Non existent key in HashTable: " + k)
    {
        BadKey = k;
    }

}

interface Table<Key, Value> : IEnumerable<Key>
{

    void Put(Key k, Value v);

    bool Contains(Key k);

    Value Get(Key k);
}

public struct KeyValue<Key, Value>
{
    public Key K { get; set;}
    public Value V { get; set; }
}

class MyTable<Key, Value>:Table<Key, Value>
{
    private int size;
    private int count=0;
    private  LinkedList<KeyValue<Key, Value>>[] items;

    public MyTable(int size)
    {
        ... 
    }

    public void SetSize(int size)
    {
        ...
    }
    public LinkedList<KeyValue<Key, Value>>[] GetItems()
    {
        return items;
    }
    protected int Getposition(Key k)
    {
       ...
    }
    protected LinkedList<KeyValue<Key, Value>> GetLinkedList(int position)
    {

        return items[position];
    }
  public  void Put(Key k, Value v)
    {   
    }

 System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
  {
      return (System.Collections.IEnumerator)GetEnumerator();
  }

public  IEnumerator<Key> GetEnumerator()
  {

      return (IEnumerator<Key>)items.GetEnumerator();
  }


  public  bool Contains(Key k)
    {
    }
   public Value Get(Key k)
    {
    }

}

class TableFactory
{

    public static MyTable<Key, Value> Make<Key, Value>(int size = 100, double loadThreshold = 0.75)
    {
        MyTable<Key, Value> mytable = new MyTable<Key, Value>(size);
        return mytable;
    }

}

class MainClass
{
    public static void Main(string[] args)
    {
        MyTable<String, String> ht = TableFactory.Make<String, String>(10, 0.75);
        ht.Put("Joe", "Doe");
        ht.Put("Jane", "Brain");
        ht.Put("Chris", "Swiss");
        try
        {
            foreach (String first in ht)
            {
                Console.WriteLine(first + " -> " + ht.Get(first));
            }
            Console.WriteLine("=========================");

            ht.Put("Wavy", "Gravy");
            ht.Put("Chris", "Bliss");
           foreach (String first in ht)
            {
                Console.WriteLine(first + " -> " + ht.Get(first));
            }
            Console.WriteLine("=========================");

            Console.Write("Jane -> ");
            Console.WriteLine(ht.Get("Jane"));
            Console.Write("John -> ");
            Console.WriteLine(ht.Get("John"));
        }
        catch (NonExistentKey<String> nek)
        {
            Console.WriteLine(nek.Message);
            Console.WriteLine(nek.StackTrace);
        }

        Console.ReadLine();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

为了更好看,我删除了一些不相关的代码。

Mar*_*zek 1

items字段声明为

private LinkedList<KeyValue<Key, Value>>[] items;
Run Code Online (Sandbox Code Playgroud)

根据MSDNLinkedList<T>实现IEnumerable<T>,在您的情况下是IEnumerable<KeyValue<Key, Value>>

因此,考虑到IEnumerable<T>.GetEnumerator()returns IEnumerator<T>,这又是IEnumerator<KeyValue<Key, Value>>您的情况,您不能将其转换为IEnumerator<Key>. 这是行不通的。

您可以尝试以下操作:

public IEnumerator<Key> GetEnumerator()
{
    return items.Select(x => x.K).GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)