将集合(HashSet)隐式转换为IEnumerable<;T>;

本文关键字:IEnumerable gt lt 转换 集合 HashSet | 更新日期: 2023-09-27 18:24:59

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

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

因为我当然不能隐式地将HashSet转换为IEnumerable<T>。我能想到的唯一方法是在HashSet中循环并生成每个元素,但我想知道是否有一种方法可以自动做到这一点,比如将列表隐式转换为IEnumerable<T>

将集合(HashSet)隐式转换为IEnumerable<;T>;

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

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

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

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