2013-07-26 27 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); 
} 
相关问题