【问题标题】:Casting List<bool> to List<object>将 List<bool> 转换为 List<object>
【发布时间】:2012-05-10 13:11:59
【问题描述】:

有没有什么捷径或更好的方法可以将List&lt;bool&gt; 转换为List&lt;object&gt;

我知道我可以通过循环和投射单个项目来做到这一点,但我想知道这是否可以在一个语句中投射整个列表。

【问题讨论】:

    标签: c# .net generics covariance


    【解决方案1】:

    您可以使用Enumerable.Cast&lt;T&gt; 方法做到这一点:

    List<bool> bools= GetBoolList();
    IList<Object> objects= bools.Cast<Object>().ToList();
    

    【讨论】:

    • 您能否提供一个相同的示例。我从来没有这样用过。
    • 只是按照您的要求进行操作 :)
    • @Sam:OP 想要反过来,将 bool 转换为对象。
    • 值得注意的是,这与创建一个新列表并具有一个循环相同的效果,在该循环中,您在添加每个项目时都对其进行大小写。它隐藏了循环,但代码仍然是 O(n) 而不是 O(1),如果你可以转换列表的话。
    【解决方案2】:

    执行此操作的非 LINQ 方法是使用 List.ConvertAll:

    List<bool> b = new List<bool> { true, false, true };
    List<object> o = b.ConvertAll(x => (object)x);
    

    由于此方法知道创建新列表的大小,因此对于大型列表,它可能比 LINQ 版本更快。

    【讨论】:

    • 谢谢加布!这是最简单的方法。
    • ConvertAll 创建一个新的 List&lt;TResult&gt; 而 LINQ 的 Cast 产生铸造项目。
    • @TimSchmelter:是的,但是 OP 正在寻找 List&lt;object&gt; 而不是 IEnumerable&lt;object&gt;
    • @Gabe:正确,ToList 也会创建一个副本。但我不明白你的观点,ConvertAll 不像Cast...ToList() 知道大小。两者都知道大小,因为源是List 而不是IEnumerable(它可以转换为ICollection&lt;T&gt;)。
    • @TimSchmelter 并不是 Cast... 只是返回一个产生的可枚举的点,所以最后的 ToList() 知道大小...
    【解决方案3】:
    List<bool> list = new List<bool>{true,true,false,false,true};
    List<Object> listObj1 = list.Select(i=> (Object)i).ToList();// First way
    List<Object> listObj2 = list.Cast<Object>().ToList();// Second way 
    List<Object> listObj3 = list.OfType<Object>().ToList();// Third way 
    

    以下是在linqpad快速测试

     list.Dump();
     listObj1.Dump();
     listObj2.Dump();
     listObj3.Dump();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多