如何将 List 转换为从 List<T> 继承的类型?
Posted
技术标签:
【中文标题】如何将 List 转换为从 List<T> 继承的类型?【英文标题】:How can I cast a List into a type which inherits from List<T>? 【发布时间】:2019-02-17 21:42:37 【问题描述】:我有两个班级:
public class Row : Dictionary<string,string>
public class Table : List<Row>
在应该返回 Table 类型的对象的方法中,我尝试使用 Where-Statement 过滤 Table 类型的对象过滤后返回这个对象。
Table table = new Table();
table = tableObject.Where(x => x.Value.Equals("")).ToList();
return table;
我的问题是生成的 IEnumerable 的演员表。
-
使用 (Table) 进行转换会引发 InvalidCastException
附加信息:无法将“System.Collections.Generic.List`1[Row]”类型的对象转换为“Table”类型。
-
使用 as Table 进行转换会导致 null 对象
如何从 IEnumerable 中返回 Table 类型的对象?
【问题讨论】:
您是否要在一个表中获取表列表或行列表? “tableObject”是什么类型? 您想获取至少有一行具有您在“Equals”中检查的值的所有表吗? 相关***.com/questions/22402329/… 所以tableObject
不是List<Table>
而是List<Row>
?
你确定从List<Row>
继承是个好主意吗? ***.com/questions/21692193/why-not-inherit-from-listt
【参考方案1】:
你可以做一个扩展方法来完成这项工作:
static class Extensions
public static Table ToTable<T>(this IEnumerable<T> collection) where T: Row
Table table = new Table();
table.AddRange(collection);
return table;
现在你可以简单地调用这个方法了:
table = tableObject.Where(x => x.Value.Equals("")).ToTable();
或者你可以直接做,因为你创建了一个空的Table
:
Table table = new Table();
table.AddRange(tableObject.Where(x => x.Value.Equals("")));
return table;
【讨论】:
@D.Weder 欢迎您。但是您在Table
中还有其他属性吗?因为在这个解决方案中他们将获得默认值!【参考方案2】:
我假设您的 tableObject
是 List<Row>
。每个Table
都是List<Row>
,但不是每个List<Row>
都是Table
,这就是强制转换不起作用的原因。
听起来提供构造函数是一个显而易见的解决方案:
public class Table : List<Row>
public Table(IEnumerable<Row> rows) : base(rows)
table = new Table(tableObject.Where(x => x.Value.Equals("")));
【讨论】:
【参考方案3】:你应该这样做:
public class Row
//whatever you have inside it
public string MyValueget;set;
public class Table
public List<Row> Rowsget;set;
Table table = new Table();
//renaming tableObject to bigListOfRows
table.Rows = bigListOfRows.Where(x => x.MyValue.Equals("")).ToList();
【讨论】:
【参考方案4】:Table table = new Table();
不是列表,所以你应该这样做:
var tables = new List<Table>();
var tableObject = new List<Table>;
tables = tableObject.ToList();
【讨论】:
您在 List 上调用 ToList() 并将其分配给另一个列表...它可能更短,例如 tables = tableObject。但我认为他的问题有别的意思。以上是关于如何将 List 转换为从 List<T> 继承的类型?的主要内容,如果未能解决你的问题,请参考以下文章
如何轻松将 DataReader 转换为 List<T>? [复制]
C# - 如何将 Lazy<List<T>> 转换为 Lazy<List<U>>?