Linq转为列出<t> </t>

时间:2014-03-24 14:15:42

标签: c# linq

我有以下课程:

public class Column
{
    public String Name;
    public String Value;
}

public class ColumnList : List<Column> {}

然后我这样做:

var cols = (from c in othercolumnlist
            select new Column
            {
               Name = c.Name,
            }).ToList() as ColumnList;

但是它返回null。我怎样才能成功进入我的名单?

4 个答案:

答案 0 :(得分:7)

ColumnListList<Column>List<Column>不是ColumnList。考虑AnimalDog类:

public class Animal
{
}

public class Dog: Animal
{
}

你要做的是将任何动物视为狗。但并非所有动物都是狗。可以有CatKangaroo。这就是as ColumnList返回null的原因。

您需要创建新的ColumnList实例,并手动添加列:

var columnList = new ColumnList();
columnList.AddRange(othercolumnlist.Select(c => new Column { Name = c.Name }));

如果您需要经常这样做,那么您可以将静态创建方法添加到ColumnList类:

public static ColumnList CreateFrom(ColumnList other)
{
     var columnList = new ColumnList();
     columnList.AddRange(other.Select(c => new Column { Name = c.Name }));
     return columnList;
}

并以这种方式使用它:

var columnList = ColumnList.CreateFrom(otherColumnList);

答案 1 :(得分:4)

您尝试做的事情与此相同:

Animal animal = new Animal();
Dog dog = animal as Dog;

一种可能的解决方案是提供一个构造函数,该构造函数接受现有列表,并调用基础构造函数,例如:

public class ColumnList : List<Column>
{
    public ColumnList(IEnumerable<Column> collection):
         base(collection)
    {
    }
}

然后从现有馆藏中构建您的ColumnList

var collection = othercolumnlist.Select(c => new Column { Name = c.Name });

var columnList = new ColumnList(collection);

您还可以提供一种扩展方法,以便更轻松:

public static class ColumnListExtensions
{
    public static ToColumnList(this IEnumerable<Column> collection)
    {
        return new ColumnList(collection);
    }   
}

var cols = othercolumnlist.Select(c => new Column { Name = c.Name })
           .ToColumnList();

答案 2 :(得分:2)

您要做的是将List<Column>向下投射到ColumnList,假设所有List<T>都是ColumnList - 这显然不是ColumnList

您可以做的是通过传递查询结果来初始化new ColumnList().AddRange(othercolumnlist .Select(x => new Column { Name = x.Name }) .ToList()); 的新实例

{{1}}

答案 3 :(得分:0)

您可以为ColumnList类型定义复制构造函数:

public class ColumnList : List<Column>
{
    public ColumnList(IEnumerable<Column> src) : base(src)
    {
    }
}

然后你做:

var cols = new ColumnList(from c in othercolumnlist
            select new Column
            {
               Name = c.Name,
            }).ToList());

原因ToList()会返回List而不是ColumnList。如果你明确地将它实例化为一个,它只能是ColumnList,但反之亦然。