1

私はlistA、を持っていlistBます。 listAのサブセットですlistB。たとえば、 に 1 つの要素が削除され、2 つの要素が追加されlistBます。次にlistA、listB から削除された要素が含まれている場合は、から削除しlistAます。また、listA新しく追加された要素を追加する必要があります。

現在、foreach{ if(list.contains) }2回使用しています。1 回追加し、1 回削除します。これは O(2n) になりますが、問題ありません。

しかし、主にLINQ/他の方法でO(n)を使用してこれを行う最良の方法はありますか?.

より明確にするために:
実際には、カスタムクラスのリストがあります。上記の質問
で私が形成しているものから(その1つのフィールドを使用して)。Web サービスから取得した文字列のリストです。コード:listAListB

//First foreach loop which I was taking about.

foreach (string A in listA)
{
  if (listB.Contains(A)
   {
   }
  else
   {
      //getting items that are added to listB
   } 
}  

//Second foreach loop which i was taking about.

foreach (string A in listB)
{
  if (listA.Contains(A)
   {
   }
  else
   {
      //getting items that are deleted from listB
   } 
}   

そして、それにList<custom class>応じて更新しています。私の主な質問は、2 つのループを使用する代わりに、foreachもっと良いことができないかということです。

4

3 に答える 3

1

これはより効率的かもしれません (状況によりますが):

var notInA = listB.Except(listA).ToList();
var notInB = listA.Except(listB).ToList();
foreach (var a in notInA)
    listA.Add(a);
foreach (var b in notInB)
    listA.Remove(b);

がカスタム クラスのIEqualityComparer<T>場合は、カスタムを実装する必要があることに注意してください。T

編集:これは両方のリストを同期しているだけです。多分私は質問を誤解したかもしれませんが、あなたは単純にできません:

listA = new List<T>(listB);
于 2012-11-16T14:09:11.630 に答える
0

これらのリストを監視できるようにする必要があります。1 つのリストが更新されたら、CollectionChanged イベントをトリガーし、コードを追加して他のリストを更新します。これを双方向にできるはずです。観察可能なコレクションを参照してください:こちら

さらに、監視可能なコレクションを使用すると、コレクションで発生したイベントの種類を検出できます。(つまり、追加、削除、置換など) これは、他のリストを同じ情報で更新するプロセスに役立ちます。

于 2012-11-16T14:51:54.973 に答える
0

foreach の代わりにイベント / デリゲートを使用できますか? ここでディスカッションを読む

于 2012-11-16T14:00:33.627 に答える