【发布时间】:2012-05-10 13:11:59
【问题描述】:
有没有什么捷径或更好的方法可以将List<bool> 转换为List<object>?
我知道我可以通过循环和投射单个项目来做到这一点,但我想知道这是否可以在一个语句中投射整个列表。
【问题讨论】:
标签: c# .net generics covariance
有没有什么捷径或更好的方法可以将List<bool> 转换为List<object>?
我知道我可以通过循环和投射单个项目来做到这一点,但我想知道这是否可以在一个语句中投射整个列表。
【问题讨论】:
标签: c# .net generics covariance
您可以使用Enumerable.Cast<T> 方法做到这一点:
List<bool> bools= GetBoolList();
IList<Object> objects= bools.Cast<Object>().ToList();
【讨论】:
执行此操作的非 LINQ 方法是使用 List.ConvertAll:
List<bool> b = new List<bool> { true, false, true };
List<object> o = b.ConvertAll(x => (object)x);
由于此方法知道创建新列表的大小,因此对于大型列表,它可能比 LINQ 版本更快。
【讨论】:
ConvertAll 创建一个新的 List<TResult> 而 LINQ 的 Cast 产生铸造项目。
List<object> 而不是 IEnumerable<object>。
ToList 也会创建一个副本。但我不明白你的观点,ConvertAll 不像Cast...ToList() 知道大小。两者都知道大小,因为源是List 而不是IEnumerable(它可以转换为ICollection<T>)。
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();
【讨论】: