如何将列表转换为继承自List <t>的类型?

时间:2018-09-13 07:43:37

标签: c# linq casting

我有两节课:

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的类型转换。

  1. 使用(表)进行转换会引发InvalidCastException
  

其他信息:无法将类型为'System.Collections.Generic.List`1 [Row]'的对象强制转换为'表'。

  1. 作为表进行的转换会导致一个空对象

如何从IEnumerable中返回类型为 Table 的对象?

4 个答案:

答案 0 :(得分:8)

您可以使用扩展方法来完成此工作:

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;

答案 1 :(得分:3)

我假设您的tableObjectList<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("")));

答案 2 :(得分:1)

您应该执行以下操作:

public class Row{
    //whatever you have inside it
    public string MyValue{get;set;}
}

public class Table{
    public List<Row> Rows{get;set;}
}

Table table = new Table();
//renaming tableObject to bigListOfRows
table.Rows = bigListOfRows.Where(x => x.MyValue.Equals("")).ToList();

答案 3 :(得分:-1)

Table table = new Table();

未列出,因此您应该执行以下操作:

var tables = new List<Table>();
var tableObject = new List<Table>{};
tables = tableObject.ToList();