C# 如何播放列表<;对象>;列出<;SomethingElse>;

C# 如何播放列表<;对象>;列出<;SomethingElse>;,c#,generics,C#,Generics,如何将列表转换为列表 (其中,SomethingElse已知从对象下降) 奖金聊天 铸造列表: List<Object> first = ...; List<SomethingElse> second = (List<SomethingElse>)first; List<SomethingElse> second = first.Cast<SomethingElse>(); List first=。。。; 第二个列表=(列表)第

如何将
列表
转换为
列表

(其中,
SomethingElse
已知从
对象下降)


奖金聊天

铸造列表:

List<Object> first = ...;

List<SomethingElse> second = (List<SomethingElse>)first;
List<SomethingElse> second = first.Cast<SomethingElse>();
List first=。。。;
第二个列表=(列表)第一个;
不起作用:

无法将类型“System.Collections.Generic.List”转换为“System.Collections.Generic.List”

铸造列表:

List<Object> first = ...;

List<SomethingElse> second = (List<SomethingElse>)first;
List<SomethingElse> second = first.Cast<SomethingElse>();
List second=first.Cast();
不起作用:

无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”

我实际上并不需要完整的
列表
对象,只需要一个
i集合
即可:

ICollection<SomethingElse> second = first;
ICollection<SomethingElse> second = (ICollection<SomethingElse>)first;
ICollection<SomethingElse> second = first.Cast<SomethingElse>();
ICollection second=第一个;
ICollection second=(ICollection)first;
ICollection second=first.Cast();

不工作。

通过类中的扩展方法实现的LINQ依赖于延迟执行:

在返回值序列的查询中使用的方法在枚举查询对象之前不会使用目标数据。这就是所谓的延迟执行

Cast
不会立即创建新列表,而是存储执行操作所需的所有信息。只有在需要时(例如,通过
foreach
语句)才会枚举该列表

在您的情况下,如果您只打算迭代该序列,则应考虑遵守<代码> iEngaby接口,这是声明的返回类型<代码> CAST >:

List<SomethingElse> second = first.Cast<SomethingElse>().ToList();
编辑:回复评论中发布的要点:

这取决于你所说的“可以修改的列表”是什么意思。有几个LINQ查询运算符允许您进一步修改查询的定义。例如,如果要删除其
IsDeleted
属性为
true
的所有
SomethingElse
元素,可以使用
Where
操作符:

IEnumerable<SomethingElse> second = first.Cast<SomethingElse>();
second = second.Where(element => !element.IsDeleted);
second = second.Concat(anotherCollectionOfSomethingElse);
second = second.OrderBy(element => element.ID);
如果要按
ID
的升序对序列进行排序,请使用
OrderBy
运算符:

IEnumerable<SomethingElse> second = first.Cast<SomethingElse>();
second = second.Where(element => !element.IsDeleted);
second = second.Concat(anotherCollectionOfSomethingElse);
second = second.OrderBy(element => element.ID);
每次,我们都在查询的前一个定义上应用一个查询运算符,并将新的(复合)查询分配给我们的
second
变量。LINQ将在查询定义中存储所有运算符。然后,当序列实际被枚举时(例如,通过
foreach
ToList
),它将给出序列的复合结果,并按顺序应用所有查询运算符


与所有延迟执行/延迟评估的情况一样,小心不要过火。例如,如果要应用一个
Where
操作符,这将大大减少序列的大小,那么急切地执行查询并存储枚举列表可能是有意义的。

我认为您已经接近
Cast
表达式了。区别在于
Cast
返回的是
IEnumerable
,而不是
列表

试试这个:

IEnumerable<SomethingElse> second = first.Cast<SomethingElse>();
IEnumerable second=first.Cast();
您可以通过执行类似操作来获取列表:

List<SomethingElse> second = first.Cast<SomethingElse>().ToList();
List second=first.Cast().ToList();

您可以选择使用
Cast
of type
<如果无法转换为指定的类型,则代码>转换
将引发异常<另一方面,code>OfType
将仅返回列表中可转换为指定类型的项目。我建议在您的情况下使用类型为的

List<Foo> fooList = myList.OfType<Foo>().ToList();
List-doulist=myList.OfType().ToList();

相关?可能会重复这项工作吗?List second=first.Select(o=>(SomethingElse)o.ToList();可能重复的我不需要立即创建新的列表;但我确实需要一个可以修改的列表,它不受协方差问题的限制。如果
ToList
是我获得所需的,那么我需要使用它。当然,我更希望返回的
列表
是第一个
的包装,也允许延迟执行。