2014-02-19 3 views
1

Я пишу хэш-таблицу с использованием данных интерфейсов, но я получаю сообщение об ошибке как заголовок вНевозможно наложить объект типа «SZArrayEnumerator» на тип «System.Collections.Generic.IEnumerator» 1 [System.String] '

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

и

foreach (String first in ht); 

весь код, как показано ниже:

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(); 
    } 
    } 
} 

Чтобы выглядеть лучше, я удалил некоторые IRR лифтовые коды.

+1

Можете ли вы поделиться меньший пример? Действительно ли весь код необходим для объяснения проблемы? – kukido

+0

Возможно, это действительно окупится, чтобы проиллюстрировать проблемы с образцами репрезентативного кода, а не размещать целые источники. Во всяком случае, здесь +10 в качестве приветствия. –

ответ

1

items поле объявляется как

private LinkedList<KeyValue<Key, Value>>[] items; 

А согласно MSDN LinkedList<T> реализует IEnumerable<T>, что в вашем случае является IEnumerable<KeyValue<Key, Value>>.

Таким образом, учитывая, что IEnumerable<T>.GetEnumerator() возвращает IEnumerator<T>, который снова IEnumerator<KeyValue<Key, Value>> в вашем случае, вы не можете бросить его IEnumerator<Key>. Это не сработает.

Вы можете попробовать следующее:

public IEnumerator<Key> GetEnumerator() 
{ 
    return items.Select(x => x.K).GetEnumerator(); 
} 
+0

Привет, MarcinJuraszek, я пробовал, но кажется, что каждый элемент в элементах имеет связанный список >, поэтому я не могу получить свой (Ключ K) с помощью x => x.K, так что я должен делать с этим? – user3330383

0
LinkedList<KeyValuePair<int, string>> items = new LinkedList<KeyValuePair<int, string>>(); 
      items.AddFirst(new KeyValuePair<int, string>(1, "qqq")); 
      items.AddFirst(new KeyValuePair<int, string>(2, "www")); 
      items.AddFirst(new KeyValuePair<int, string>(3, "eee")); 

      var keys = items.Select(item => item.Key); 

      foreach (var key in keys) 
      { 

      } 
+0

Пожалуйста, добавьте некоторое объяснение с кодом, как этот ответ поможет OP в решении проблемы. –

Смежные вопросы