関係のあるデータを複数箇所で管理する場合

上記のようなことになった場合、まずはデータを
1,ベースとなるデータ
2,ベースを加工して使用するデータ(利用側)
に分けて考える。その上で、
利用側データに対応するベースデータへの参照を持たせる(リンクを張る)
ベースとなるデータは並び変えや削除などは行わない。操作はレコードの追加
のみとする。


例)
DataGridViewにて、ソート処理と表示抽出処理を行う場合には
ベースデータと表示データの2種類に分けられる。
処理的には
・表示するデータ(ベース)
・ソート後のデータ
・表示抽出フィルタ実行後のデータ
が考えられる。
この内、ソート後データとフィルタ実行後のデータは1つにできそう。

class CustomDataGridView
{
  private DataGridView inner_grid;

  //内部データレコード
  public class RecordData
  {
    //フィールド定義
  }

  //表示用データ
  public class DispInfo
  {
    public RecordData refRec;  //ベースレコードへの参照
    public bool visible;  //表示フラグ フィルタ処理結果
  }

  //List<>型でSortできたっけ?
  private List<RecordData> inner_base_data;  //ベースデータ
  private List<DispInfo> disp_data;  //表示データ

  //ヘッダクリックイベント  引数・内部処理は適当
  public void CustomDataGridView_HeaderColumnMouseClick(Object sender, EventArgs e)
  {
      RecordDataSorter sorter = (DefaultSorter)inner_grid.Columns[e.ColumnIndex].Tag
      disp_data.sort(sorter);  //加工データ構造に対してソート
  }

  //表示イベント 引数・内部処理は適当
  public void CustomDataGridView_CellValueNeeded(Object sender, EvantArgs e)
  {
    if(disp_data[e.RowIndex].visible)  //表示する
    {
      RecordData rec = disp_data[e.RowIndex].refRec;  //参照先ベースレコード
      inner_grid.Rows[e.RowIndex].Value = rec.Value;  //表示
    }
  }
}