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

C# 使用Lambda和C将对象的泛型列表转换为定义的集合类#,c#,.net,linq,list,C#,.net,Linq,List,这是我在两份不同的工作中看到的一个问题,这两份工作使用三层结构,但还没有找到一个干净的解决方法。我相信这也适用于使用LINQ语句 我有两个类,一个是对象,另一个是这些对象的定义集合,其中可能包含一些附加功能: public class TestObject { public Int32 id {get; set;} public string value {get; set;} } public class TestObjec

这是我在两份不同的工作中看到的一个问题,这两份工作使用三层结构,但还没有找到一个干净的解决方法。我相信这也适用于使用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表达式返回的GenericList强制转换到TestObjectCollection,而不必在返回的结果中循环添加步骤。

不,没有
ToList
创建一个
列表
——如果不创建一个新的
TestObjectCollection
,就无法将一个普通的
列表
转换为
TestObjectCollection

就我个人而言,我根本不会创建从
列表派生的集合(我几乎总是使用组合),但如果您真的想拥有该集合,最简单的方法是创建您自己的扩展方法:

public static class TestEnumerable
{
     public static TestObjectCollection ToTestObjectCollection(this IEnumerable<TestObject> source)
     {
         return new TestObjectCollection(source);
     }
}

不,没有
ToList
创建一个
列表
——如果不创建一个新的
TestObjectCollection
,就无法将一个普通的
列表
转换为
TestObjectCollection

就我个人而言,我根本不会创建从
列表派生的集合(我几乎总是使用组合),但如果您真的想拥有该集合,最简单的方法是创建您自己的扩展方法:

public static class TestEnumerable
{
     public static TestObjectCollection ToTestObjectCollection(this IEnumerable<TestObject> source)
     {
         return new TestObjectCollection(source);
     }
}
似乎应该有一种方法来转换 在没有添加步骤的情况下,将Lamda表达式添加到我的TestObjectCollection 循环浏览我返回的结果

没有,因为对于泛型集合,您可以使用协方差,而不是反方差

除了Jon的解决方案(这很好),您还可以创建构造函数重载:

  public class TestObjectCollection: List<TestObject>
  {
     public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
     ...
  }
似乎应该有一种方法来转换 在没有添加步骤的情况下,将Lamda表达式添加到我的TestObjectCollection 循环浏览我返回的结果

没有,因为对于泛型集合,您可以使用协方差,而不是反方差

除了Jon的解决方案(这很好),您还可以创建构造函数重载:

  public class TestObjectCollection: List<TestObject>
  {
     public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
     ...
  }

我看不出使用
列表
,或
增强列表
,或
添加范围(IEnumerable)
有什么问题
AddRange
通常接受IEnumerable,这意味着您可以直接传递LINQ查询。问题更可能出现在
TestObjectCollection
的实现中。您想用创建所需列表类型的不同扩展方法替换
.ToList()
调用。也许您应该为
DBSet
list
编写一个扩展方法。我看不出使用
列表的问题,或
增强列表
,或
添加范围(IEnumerable)
AddRange
通常接受IEnumerable,这意味着您可以直接传递LINQ查询。问题更可能出现在
TestObjectCollection
的实现中,您想用创建所需列表类型的不同扩展方法替换
.ToList()
调用。也许您应该向
DBSet
list
编写一个扩展方法。
  public class TestObjectCollection: List<TestObject>
  {
     public TestObjectCollection(IEnumerable<TestObject> list) { AddRange(list);}
     ...
  }
var resultAsCollection = new TestObjectCollection(data.Where(item => item.id > 0));