2

私は2つのリストを持っています:

ListA { 'A', 'B', 'C' } //ListA is DictA.Keys
ListB { 'B', 'X', 'Y' } //ListB is DictB.Keys

その場合ListA.Except(ListB)、ExceptIterator が返され、ListB にない項目について ListA を反復処理できます。問題は、その実装が単純に ListA も使用することであるということです (何らかの理由で、違いであるアイテムの新しいコレクションが作成されると思いました)。よく考えてみると、まだ ListA をソースとして使用していることがわかりましたが、単に特殊なタイプのイテレーターを使用しているだけです。もちろん、ListA から項目を削除すると、コレクションが変更されたと不平を言います。

やりたいことを行うにはいくつかの方法が考えられます。まず、ListA をコピーして、そのコピーに対して例外を実行します。2 つ目は、while ループを実行することです。この問題に対する最善の解決策は何か、標準的なガイドラインに従うのは何か、ということだけを考えています。

もし私がこれについて間違ったやり方をしているなら、私はそれを知りたいです. 私の主な目標は、キーを比較として使用して、DictB にない DictA からすべてを削除することです。

4

6 に答える 6

3

結果を保持し、後の変更に依存しないようにする必要がある場合は、クエリでToList()orを呼び出して具体的な結果を取得するだけです。ToArray()

var query = list1.Except(list2).ToList(); 

どちらのソース入力を変更しても、完全に評価されたクエリには影響しません。

于 2011-07-07T19:46:49.557 に答える
2

熱心な評価を使用しないのはなぜですか?

var myList = ListA.Except(ListB).ToList();
于 2011-07-07T19:47:24.037 に答える
2

同じ理由で、次を使用します。

ListA = ListA.Except(ListB).ToList();
于 2011-07-07T19:48:44.933 に答える
0

多分あなたはこれについて逆行しているでしょう。「DictBにないDictAからすべてを削除する」と言う別の方法は、「DictBにもあるDictAにすべてを保持する」と言うことです。ListAから物を削除しようとする代わりに、新しいリストを作成するだけです。

ListA.Join(ListB, ...);
于 2011-07-07T19:50:40.753 に答える
0

問題のデータ構造を制御できる場合は、述語 (リストのデータ型を受け入れ、ブール値を返す関数) を受け入れ、述語が true を返すすべての項目を削除する Purge メソッドを定義すると便利です ( Microsoft が IPurgeableCollection を定義してくれたらよかったのにと思います。なぜなら、通常の Microsoft コレクションの多くにこのようなルーチンを実装することは本質的に困難ではないからです)。多くの場合、列挙中に一般的な変更を許可するよりもコレクションに Purge メソッドを実装する方がはるかに簡単であり、多くの場合、そのようなメソッドは、データの余分なコピーを作成する必要性を回避できるだけではないことに注意してください。が削除されますが、削除を実行するために必要な作業量を大幅に削減することもできます (たとえば、辞書をパージする場合、

于 2011-07-08T14:49:33.667 に答える
0

2 つの辞書の共通部分が必要な場合は、次のようにします。

IEnumerable<KeyValuePair<Char, String>> result = DictB.Intersect<KeyValuePair<Char, String>>(DictA);

これにより、DictB に一致する DictA 内のすべてのアイテムが返されます。また、この例では、キーは Char 型で、値は String 型であると想定しています。あなたのタイプが異なる場合は、ソリューションに正しいタイプを設定してください。実際の結果を表示するには、result.GetEnumerator() を送信するか、foreach ステートメントで使用する必要があります。

于 2011-07-08T12:53:59.133 に答える