【问题标题】:Converting Generic List of object to defined collection class with Lambda and C#使用 Lambda 和 C# 将对象的通用列表转换为定义的集合类
【发布时间】:2015-08-07 14:30:33
【问题描述】:

这是我在使用 3 层结构的两个不同工作中看到的一个问题,但还没有找到干净的解决方法。我相信这也适用于使用 LINQ 语句。

我有 2 个类,一个是对象,另一个是这些对象的已定义集合,其中可能包含一些附加功能:

    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,而无需通过添加的步骤循环遍历返回的结果。

【问题讨论】:

  • 我看不出使用List&lt;T&gt;EnhancedList&lt;T&gt;AddRange(IEnumerable&lt;T&gt;) 的问题。 AddRange 通常接受 IEnumerable ,这意味着您可以直接传递 LINQ 查询。在TestObjectCollection的实现中更有可能出现问题
  • 您想用创建所需列表类型的不同扩展方法替换 .ToList() 调用。
  • 也许你应该为DBSetList写一个扩展方法。

标签: c# .net linq list


【解决方案1】:

不,没有。 ToList 创建一个 List&lt;T&gt; - 如果不创建一个新的 TestObjectCollection,就无法将普通的 List&lt;T&gt; 转换为 TestObjectCollection

就我个人而言,我会完全避免创建从 List&lt;T&gt; 派生的集合(我几乎总是改用组合)但如果你真的想要拥有它集合,最简单的方法是创建自己的扩展方法:

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

... 并实现适当的构造函数,当然,它可能只是链接到List(IEnumerable&lt;T&gt;) 构造函数。然后你可以写:

var resultAsCollection = data.Where(item => item.id > 0).ToTestObjectCollection();

【讨论】:

    【解决方案2】:

    似乎应该有一种方法可以转换我返回的 GenericList 没有添加步骤的我的 TestObjectCollection 的 Lamda 表达式 循环遍历我返回的结果

    这不是因为泛型集合可以使用协变而不是逆变。

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

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

    用法:

    var resultAsCollection = new TestObjectCollection(data.Where(item => item.id > 0));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2018-06-07
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多