【问题标题】:Returning the innerlist from a custom collection inheriting from List<T>从继承自 List<T> 的自定义集合返回内部列表
【发布时间】:2011-01-06 17:59:42
【问题描述】:

我创建了一个继承自 List 的自定义集合,我创建了一个对我的数据进行一些处理的方法。我所有的操作都是从 Collection 中的一个私有字段完成的。

我已将我的 Private 字段设置为引用 this 对象,然后我需要对我的数据进行排序以便进行计算。我用 Linq 做,认为 *this 和我的 Private Field 是一样的。但是使用 Linq 所做的更改不会更改 this 对象。虽然我所做的所有其他更改都会改变它。

class OrdersDetailCollection : List<OrdersDetail>
{
    List<OrdersDetail> _List;
    public OrdersDetailCollection(IEnumerable<OrdersDetail> input)
    {
        this.AddRange(input);
        _List = this;
        _List = (from l in _List
                 orderby l.Item, l.DateExp
                 select l).ToList();
    }

    public void CalculateQty()
    {
        RemoveDuplicate();

        _List = (from l in _List
                 where double.Parse(l.QteBO) > 0
                 orderby l.DateExp, l.Item
                 select l).ToList();
    }

    private void RemoveDuplicate()
    {
       //Do some stuff to _List
    }

this 和 _List 是否应该相同,因为它们引用了内存中的相同空间?如何将 _List 分配给这个?

我的自定义集合缺少什么,以便我可以像使用列表一样使用它并执行以下操作(简化)?

OrdersDetailCollection ShipList = new OrdersDetailCollection(/*Value from SQL*/)
ShipList.CalculateQty();
return ShipList;

我想知道如何在没有扩展方法的情况下做到这一点,我认为yield可能与它有关,但不是很了解。

【问题讨论】:

    标签: c# linq generics collections


    【解决方案1】:

    更改_List 只是将字段(不是实际列表)更改为完全不相关的列表。简而言之,继承不会很好地满足您在这里的需求。你不能重新分配“this”(至少,不能为一个班级)。

    我怀疑封装这个列表会更适合你。

    【讨论】:

    • 你能不能更具体一点,通过封装。因为我已经通过让属性返回 _List 来使其工作,并且实际上并不需要继承。我只是想知道(据我所知)这是否是一种扩展 List 并通过函数调用来操作它的内容的方法。也许从另一个类继承?
    • @Nigol - 在函数中重新更改它;您当然可以改变列表 - 例如调用 Clear、Sort、Add、Remove 等。
    • 好的,我明白你的意思,是的,它就是这样工作的。但我必须在每次 Linq 查询后清除和 AddRange。
    【解决方案2】:

    您对ToList 的调用会创建一个不再等于this 的新引用。

    看起来你最好把这个类作为一个“帮助者”,通过保持列表:

    public class OrderDetailCollection
    {
        private List<OrdersDetail> _List;
        public OrdersDetailCollection(IEnumerable<OrdersDetail> input)
        {
            this._List = input.OrderBy(xx => xx.Item)
                              .ThenBy(xx => xx.DateExp)
                              .ToList();
           RemoveDuplicates();
        }
    
        public IEnumerable<OrdersDetail> CalculateQuantity()
        {
             return from xx in this._List
                   where double.Parse(xx.QteBO) > 0.0
                   orderby xx.DateExp, xx.Item
                   select xx;
        }
    }
    

    【讨论】:

    • 好的,所以问题出在 .ToList 上。所以我没有办法在不创建扩展的情况下保持继承和“扩展” List 类(只是要知道,因为我有它使用类似的东西)
    【解决方案3】:

    从我得到的建议来看,问题似乎是 Linq 查询中的 .ToList 引用了一个新列表。所以我只是在 Linq 查询之后添加了一个 Clear 和一个 AddRange。但最好的方法是不要尝试继承。所以这就是答案。

    class OrdersDetailCollection : List<OrdersDetail>
    {
        List<OrdersDetail> _List;
        public OrdersDetailCollection(IEnumerable<OrdersDetail> input)
    {
        this.AddRange(input);
        _List = this;
        _List = (from l in _List
                 orderby l.Item, l.DateExp
                 select l).ToList();
    
        this.Clear();
        this.AddRange(_List);
    }
    
    public void CalculateQty()
    {
        RemoveDuplicate();
    
        _List = (from l in _List
                 where double.Parse(l.QteBO) > 0
                 orderby l.DateExp, l.Item
                 select l).ToList();
    
        this.Clear();
        this.AddRange(_List);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多