如何有效地转换List <T>?

ben*_*ord 23 c# linq-to-sql

我有一个

List<InputField> 
Run Code Online (Sandbox Code Playgroud)

但我需要一个

List<IDataField>  
Run Code Online (Sandbox Code Playgroud)

有没有办法在c#中转换它?或者使用Linq获得相同的结果?

我有两个实现相同接口的类:

interface IDataField { }
class InputField : IDataField { }
class PurchaseField : IDataField { }
Run Code Online (Sandbox Code Playgroud)

此列表来自Linq-to-Sql查询:

List<InputField> list = (from i .... select i).ToList();
Run Code Online (Sandbox Code Playgroud)

Hel*_*mik 41

.OfType <T>和.Cast <T>都将返回T列表,但两种方法的含义不同.

list.OfType 过滤原始列表并返回T类型的所有项目,并跳过那些不属于该类型的项目.

list.Cast 原始列表中的所有项目强制转换为T类型,并为无法转换为该类型的项目抛出异常.

在你的情况下,两者都会给出相同的结果,但使用.Cast可以更清楚地传达你的意图,所以我建议使用它.

List<InputField> list = (from i .... select i).Cast<IDataField>.ToList();
Run Code Online (Sandbox Code Playgroud)


Amy*_*y B 11

List<InputField> raw = (from i .... select i).ToList();
List<IDataField> result = raw.OfType<IDataField>().ToList();
Run Code Online (Sandbox Code Playgroud)


Cub*_*anX 7

您也可以使用List.ConvertAll.

文档:http://msdn.microsoft.com/en-us/library/73fe8cwf.aspx

例:

List<IDataField> newList = oldList.ConvertAll(i => i as IDataField);
Run Code Online (Sandbox Code Playgroud)

  • 正是我要说的.请注意,在C#2.0中,您需要明确指定泛型,但在C#3.0(如上所述)中,它是推断的. (2认同)

Arj*_*nbu 5

由于列表来自

List<InputField> list = (from i .... select i).ToList();
Run Code Online (Sandbox Code Playgroud)

难道你不能只修复"选择我"部分而不是返回IDataField吗?像这样的东西:

List<InputField> list = (from i .... select (IDataField)i).ToList();
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,也许IEnumerable的"Cast"扩展可以工作:

List<DataField> list2 = list.Cast<IDataField>();
Run Code Online (Sandbox Code Playgroud)