如何将List <object>转换为List <SomethingElse>
我怎样才能将List<object>
为List<SomethingElse>
?
( SomethingElse
已知从object
下降 )
奖金喋喋不休
投射清单:
List<Object> first = ...; List<SomethingElse> second = (List<SomethingElse>)first;
不起作用:
无法将types“System.Collections.Generic.List”转换为“System.Collections.Generic.List”
投射清单:
List<SomethingElse> second = first.Cast<SomethingElse>();
不起作用:
不能隐式地将types“System.Collections.Generic.List”转换为“System.Collections.Generic.List”
我实际上并不需要完整的List<T>
对象,只是一个ICollection<T>
会做:
ICollection<SomethingElse> second = first; ICollection<SomethingElse> second = (ICollection<SomethingElse>)first; ICollection<SomethingElse> second = first.Cast<SomethingElse>();
不工作。
通过Enumerable
类中的扩展方法实现的LINQ依赖于延迟执行:
用于返回值序列的查询中的方法在枚举查询对象之前不消耗目标数据。 这被称为延期执行。
Cast<T>
不会立即创build新列表,而是存储执行操作所需的所有信息。 该列表只会在需要时被枚举(例如,通过foreach
语句)。
在你的情况下,如果你只是想迭代序列,你应该考虑坚持IEnumerable<T>
接口,它是Cast<T>
的声明返回types:
IEnumerable<SomethingElse> second = first.Cast<SomethingElse>(); foreach (SomethingElse se in second) { // ... }
这是有效的,因为它只在每个项目被迭代时才执行转换。
如果您确信要立即创build新列表,请使用ToList
:
List<SomethingElse> second = first.Cast<SomethingElse>().ToList();
编辑 :回复点评发表评论:
这取决于你的意思是“可以修改的列表”。 有几个LINQ查询运算符将允许您进一步更改您的查询的定义。 例如,如果要删除IsDeleted
属性为true
所有SomethingElse
元素,则可以使用Where
运算符:
IEnumerable<SomethingElse> second = first.Cast<SomethingElse>(); second = second.Where(element => !element.IsDeleted);
如果你想添加一个新的元素序列,你可以使用Concat
操作符:
second = second.Concat(anotherCollectionOfSomethingElse);
如果要按照ID
升序对序列进行sorting,请使用OrderBy
运算符:
second = second.OrderBy(element => element.ID);
每一次,我们在查询的前一个定义上应用一个查询操作符,并将新的(复合)查询分配给我们的second
variables。 LINQ会将所有的操作符存储在查询定义中。 然后,当序列实际枚举(例如,通过foreach
或ToList
)时,它将为您提供序列的合成结果,并按顺序应用所有查询运算符。
与所有延期执行/懒惰评估的情况一样,注意不要过分执行此操作。 例如,如果您打算应用一个Where
操作符来大幅减less序列的大小,那么可以切实执行查询并存储枚举列表。
我认为你接近Cast<T>
expression式。 不同的是Cast<T>
返回一个IEnumerable<T>
,而不是一个List<T>
。
尝试这个:
IEnumerable<SomethingElse> second = first.Cast<SomethingElse>();
你可以通过类似的方式得到一个列表:
List<SomethingElse> second = first.Cast<SomethingElse>().ToList();
您可以select使用Cast
或OfType
。 如果不能转换为指定的types, Cast
将会抛出一个exception。 另一方面, OfType
将只返回列表中可以转换为指定types的项目。 我会build议在你的情况下使用OfType
。
List<Foo> fooList = myList.OfType<Foo>().ToList();