使用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,而不需要在返回的结果中循环添加步骤。

使用Lambda和c#将对象的泛型列表转换为已定义的集合类

没有。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));