2011-01-06 7 views
1

Listから継承するカスタムコレクションを作成しました。私は自分のデータに機能するメソッドを作成しました。すべての私の操作は、コレクション内のプライベートフィールドから行われます。リストから継承したカスタムコレクションからinnerlistを返す<T>

このオブジェクトを参照するようにプライベートフィールドを設定していますので、計算を行うためにデータを並べ替える必要があります。私はLinqとそれをやって、* これはと私のプライベートフィールドは同じです。しかし、Linqで行われた変更はこのオブジェクトを変更しません。私が作ったすべての変更はそれを変更しますが。彼らはメモリ内の同じ空間を参照するため、

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 
    } 

このと_Listは同じではないでしょうか?これに_Listを割り当てる方法は?

私のカスタムコレクションには何がありませんので、リストと同じ方法で使えますか?

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

私は収量はそれとは何かを持っているかもしれませんが、本当によくそれを理解していない考えています、拡張メソッドなしでこれを行う方法を知りたいです。

答えて

2

が_Listは、単ににフィールド(ない実際のリスト)を変更している変更全く関係のないリスト。短い継承では、あなたがここで望むものに対してうまくいくわけではありません。あなたは「これ」を(少なくともクラスのためではなく)再割り当てすることはできません。

がカプセル化されていると思われます。リストがうまくいくはずです。

+0

カプセル化することで、より具体的になることができますか?なぜなら、_Listを返すPropertyを持つことによってそれを機能させていて、継承は本当に必要ないからです。 Listを拡張して関数からの呼び出しでコンテンツを操作する方法であれば(私の知る限り)知りたかっただけです。別のクラスを継承しているかもしれませんか? – Nigol

+0

@Nigol - 関数を変更しました。あなたは確かに*リストを突然変異させることができます - たとえば、Clear、Sort、Add、Removeなどを呼び出します。 –

+0

ok私はあなたが何を意味するか見ています。しかし、私はすべてのLinqクエリの後にAddRangeとクリアする必要があります。 – Nigol

1

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; 
    } 
} 
+0

okだから問題は.ToListです。したがって、継承を維持し、拡張を作成せずにListクラスを拡張する方法はありません(同様のことをしているので、知っておいてください)。 – Nigol

0

私が問題を持っているのは、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); 
} 
関連する問題