【问题标题】:Initialize list from array using a initializer list使用初始化列表从数组初始化列表
【发布时间】:2011-06-05 03:12:24
【问题描述】:

基类具有List<SomeEnum> 类型的只读 字段,派生类将对其进行初始化。现在,有一个派生类,我想在其中添加 SomeEnum 的所有值。一种方法是把所有的枚举值都打进去,但是枚举有点大,有没有其他办法呢?

public class Base
{
 private readonly List<SomeEnum> _list;

 protected Base(List<SomeEnum> list)
 {
  _list = list;
 }
}

public class Derived : Base
{
 public Derived() : base(new List<SomeEnum>() { Enum.GetValues(typeof(SomeEnum)) }
 {
 }
}

(上面的代码不会编译,我相信初始化器不接受数组。)

【问题讨论】:

  • 您可能希望在基本构造函数中接受 IEnumerable&lt;SomeEnum&gt;IList&lt;SomeEnum&gt; 以提高灵活性。

标签: c# list initializer


【解决方案1】:

这是因为您必须将 Enum.GetValues 的结果转换为适当的 IEnumerable 类型。见这里:

using System.Linq;


public class Derived : Base
{
    public Derived()
        : base(new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)).OfType<SomeEnum>()))
    {
    }
}

【讨论】:

  • 你必须导入 System.Linq。
【解决方案2】:

正如 Mark 所写,有一个 List 构造函数接受一个可枚举的,也许您可​​以通过以下(较少耦合)方式来利用它:

public class Base 
{     
  private readonly List<UserActions> _list;      

  protected Base(IEnumerable<UserActions> values)
  {         _list = new List<UserActions>(values);  
  } 
}  

public class Derived : Base 
{     
   public Derived() : base((UserActions[]) Enum.GetValues(typeof(UserActions))
  { 
  }
} 

【讨论】:

    【解决方案3】:

    这行不通,因为集合初始化程序使用您的参数调用 Add,并且您不能使用 Add 方法将数组添加到列表(您需要 AddRange 代替)。

    但是有一个constructorList&lt;T&gt; 可以接受IEnumerable&lt;T&gt;。试试这个:

    new List<SomeEnum>((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)))
    

    【讨论】:

    • 这不会编译。 Enum.GetValues 返回一个未实现 IEnumerable 的数组。它不是通用的。
    • 我不知道为什么这个答案被投票赞成。它不起作用。请参阅我对确实有效的答案。
    【解决方案4】:

    您是否尝试过在列表的构造函数中传递值数组,如下所示:

    public Derived() : 
             base(new List<SomeEnum>(Enum.GetValues(typeof(UserActions))) 
    {}
    

    【讨论】:

    • 数组不实现 IEnumerable。所以代码无法编译。
    • @hab: 实际上数组确实实现了 IEnumerable。
    【解决方案5】:
    base(new List<SomeEnum>(((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)).GetEnumerator())))
    

    我通过将返回的枚举数转换为泛型类型(List 接受)来使其工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2011-08-09
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多