2016-09-06 6 views
0

複数のリストで参照されているオブジェクトを、一致するインターフェイスクラスの新しいインスタンスに置き換えたいとします。複数のリストで参照されているオブジェクトを新しいインスタンスに簡単に置き換える方法はありますか?

ここでは、問題をよりよく理解するための例を示します。

  1. そのインターフェイスを実装する2つのクラスがありますIPosition
  2. と呼ばれるインターフェースがあります。基本的には複数のリスト、List<IPosition>[]:私のアルゴリズムでRealPositionAccessiblePosition
  3. が、私はこのように、IPositionリストの配列を受け付けております
  4. リストがオブジェクトの同じインスタンスを参照するのは非常に一般的です。 Multiple List items referencing the same object.
  5. AccessiblePositionクラスのnewインスタンスを作成し、すべてのリスト内のすべての参照を更新したいと考えています。

これを簡単に行う方法はありますか?

事前に感謝します。

+0

すべてのリストを取って、見つけたインデックスを使用して検索してください。簡単です。 – zerkms

答えて

2

データ用のコンテナを作成することができます。

public interface IContainer<T> 
{ 
    T Data { get; set; } 
} 

およびList<IContainer<IPosition>>

ここでは、アイテム参照を変更する代わりに、Dataをコンテナに変更することができます。

+0

例を挙げてください。私はこのソリューションとListの配列をどのように使っていますか?あなたは 'List > []'を持つことを意味しますか?だから基本的にそれらのリストの配列? – Konstantin

0

リストを繰り返して項目を比較するだけで済みます。

public interface IPosition 
{ 
    int ID { get; set; } 
} 

public class RealPosition : IPosition 
{ 
    public int ID { get; set; } 
} 

public class AccessiblePosition : IPosition 
{ 
    public int ID { get; set; } 
} 

void Main() 
{ 
    var toReplace = new RealPosition { ID = 1 };   
    var list1 = new List<IPosition> 
    { 
     toReplace, 
     new RealPosition { ID = 2 }, 
     new RealPosition { ID = 3 }, 
    }; 
    var list2 = new List<IPosition> 
    { 
     toReplace, 
     new RealPosition { ID = 4 }, 
     new RealPosition { ID = 5 }, 
    }; 
    var listOfLists = new List<List<IPosition>>{ list1, list2 }; 
    var replacement = new AccessiblePosition{ ID = 42 }; 

    foreach(var list in listOfLists) 
    { 
     //must use for here 
     for(int i = 0; i < list.Count; ++i) 
     { 
      if(list[i] == toReplace) 
      {      
       list[i] = replacement; 
      } 
     } 
    } 
} 
+0

多くのありがとう@Greg!私はこのことを考えました。それはまさに私が避けたいものです。理由は何千ものリストがあるため、ランタイムに最適化されたソリューションが必要です。 – Konstantin

関連する問題