2013-07-26 30 views
1

我有一個簡單的抽象枚舉類:隱式轉換集合(HashSet的)到IEnumerable的<T>

public abstract class Enumeration<T> { 

    protected readonly T _value; 
    private static readonly HashSet<Enumeration<T>> _values 
     = new HastSet<Enumeration<T>>(); 

    protected Enumeration(T value) { 
     _value = value; 
     _values.Add(this); 
    } 

} 

現在我想有在HashSet中返回的每一個元素的方法,而不是HashSet的本身( - >作爲IEnumerable)。

但是,這並不工作:

public static IEnumerable<T> GetValues() { 
    return _values; 
} 

,因爲我不能隱式轉換HashSetIEnumerable<T>,當然。我能想到的唯一方法是循環遍歷HashSet併產生每個元素,但是我想知道是否有辦法自動執行此操作,例如當您隱式地將列表投射到IEnumerable<T>時。

+1

您可以執行'_yourHashSet.AsEnumerable()'。但我不是100%肯定的,但它可以提供hashset刪除的副本 – wudzik

+0

HashSet **是**可枚舉的。你確切的問題是什麼?爲什麼要添加'this'來hashset'_values.Add(this);'? –

+1

@wudzik WHOOPS。我的錯!我試着用AsEnumerable(),但它沒有工作,因爲我不能將IEnumerable >轉換爲IEnumerable - 事實證明,我不得不改變返回值。我顯然需要睡覺。 :/ – Atrotygma

回答

5

您可以隱式轉換HashSet<T>IEnumerable<T>,因爲HashSet的,像ewvery其他泛型集合類型,實現IEnumerable<T>

然而,出於顯而易見的原因,你不能轉換到HashSet<U>IEnumerable<T>,除非U可以轉換爲T(在這種情況下,你可以使用隱式的協變轉換)。

您的HashSet是(但可能不應該是)Enumeration<T>的集合,而不是T

0
public static IEnumerable<T> GetValues() 
{ 
    return _values.Select(e => e._value); 
} 
相關問題