【问题标题】:Implicitly convert collection (HashSet) to IEnumerable<T>将集合 (HashSet) 隐式转换为 IEnumerable<T>
【发布时间】:2013-07-26 13:06:35
【问题描述】:

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

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&lt;T&gt;。我能想到的唯一方法是遍历 HashSet 并产生每个元素,但我想知道是否有一种方法可以自动执行此操作,例如将列表隐式转换为 IEnumerable&lt;T&gt;

【问题讨论】:

  • 你可以做_yourHashSet.AsEnumerable()。但我不是 100% 确定,但它可以提供由 hashset 删除的重复项
  • HashSet 可枚举的。你的确切问题是什么?为什么要将this 添加到哈希集_values.Add(this);
  • @wudzik 哎呀。我的错!我尝试使用 AsEnumerable() 但它不起作用,因为我无法将 IEnumerable> 转换为 IEnumerable - 结果我必须更改返回值。很明显,我需要睡觉。 ://
  • @lazyberezovsky 因为它是一个枚举,我不想使用反射来获取所有定义的字段。 ;)

标签: c# .net linq collections casting


【解决方案1】:

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

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

您的 HashSet 是(但可能不应该是)Enumeration&lt;T&gt; 的集合,而不是 T

【讨论】:

    【解决方案2】:
    public static IEnumerable<T> GetValues()
    {
        return _values.Select(e => e._value);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多