使用Lambda和c#将对象的泛型列表转换为已定义的集合类
本文关键字:转换 定义 集合类 列表 泛型 对象 使用 Lambda | 更新日期: 2023-09-27 18:06:48
这是我在两个使用三层结构的不同工作中看到的问题,并且还没有找到一个干净的方法来解决它。我相信这也适用于使用LINQ语句。
我有两个类,一个是对象,另一个是那些对象的定义集合,其中可能有一些额外的功能:
public class TestObject
{
public Int32 id {get; set;}
public string value {get; set;}
}
public class TestObjectCollection: List<TestObject>
{
public TestObject Get(Int32 id)
{
return this.FirstOrDefault(item => item.id==id);
}
}
假设我使用一个lambda表达式:
List<TestObject> result = data.Where(item => item.id > 0).ToList();
是否有一种简单的方法将对象列表转换为我定义的集合,而不需要做这样的事情:
TestObjectCollection resultAsCollection = new TestObjectCollection()
resultAsCollection.AddRange(result);
似乎应该有一种方法将Lambda表达式返回的GenericList转换为TestObjectCollection,而不需要在返回的结果中循环添加步骤。
没有。ToList
创建了一个List<T>
——如果不创建一个新的TestObjectCollection
,就没有办法将一个普通的List<T>
转换为TestObjectCollection
。
我个人会避免创建一个从List<T>
派生的集合(我几乎总是使用组合),但如果你真的想要有这个集合,最简单的方法是创建你自己的扩展方法:
public static class TestEnumerable
{
public static TestObjectCollection ToTestObjectCollection(this IEnumerable<TestObject> source)
{
return new TestObjectCollection(source);
}
}
…并实现适当的构造函数,当然,它可能只是链接到List(IEnumerable<T>)
构造函数。然后你可以写:
var resultAsCollection = data.Where(item => item.id > 0).ToTestObjectCollection();
似乎应该有一种方法来强制转换我的GenericList将lambda表达式添加到TestObjectCollection中,无需添加步骤循环遍历返回的结果
没有,因为对于泛型集合,你可以使用协方差而不是逆变。
除了Jon的解决方案(这很好),你可以创建构造函数重载:
public class TestObjectCollection: List<TestObject>
{
public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
...
}
用法:
var resultAsCollection = new TestObjectCollection(data.Where(item => item.id > 0));