将集合(HashSet)隐式转换为IEnumerable <t> </t>

时间:2013-07-26 13:06:35

标签: c# .net linq collections casting

我有一个简单的抽象枚举类:

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本身( - &gt;作为IEnumerable)。

但这不起作用:

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

因为我当然不能隐含地将HashSet转换为IEnumerable<T>。我能想到的唯一方法是循环遍历HashSet并产生每个元素,但我想知道是否有办法自动执行此操作,例如当您隐式地将列表强制转换为IEnumerable<T>时。

2 个答案:

答案 0 :(得分:6)

您可以隐式地将HashSet<T>转换为IEnumerable<T>,因为HashSet与其他通用集合类型一样,实现了IEnumerable<T>

但是,由于显而易见的原因,您无法将HashSet<U>转换为IEnumerable<T>,除非U可转换为T(在这种情况下,您可以使用隐式协变转换)

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

答案 1 :(得分:0)

public static IEnumerable<T> GetValues()
{
    return _values.Select(e => e._value);
}