11

私は2つのリストを持っています。LIST2に存在しないアイテムをLIST1から削除したい。

したがって、たとえば:

        var list1 = new List<DownloadTask>();
        list1.Add(new DownloadTask{ OperationID = 1, MachineID = 1 });
        list1.Add(new DownloadTask{ OperationID = 2, MachineID = 1 });
        list1.Add(new DownloadTask{ OperationID = 3, MachineID = 1 });
        list1.Add(new DownloadTask{ OperationID = 3, MachineID = 2 });

        var list2 = new List<DownloadTask>();
        list2.Add(new DownloadTask{ OperationID = 1, MachineID = 1 });
        list2.Add(new DownloadTask{ OperationID = 3, MachineID = 2 });

実行後list1は、次の項目のみを含める必要があります:operationId = 1machineId = 1AND OperationId = 3、の組み合わせMachineId =2

4

4 に答える 4

28

私はそれがあるべきだと思います:

list1.RemoveAll(x => list2.Exists(y => y.OperationID == x.OperationID && y.MachineID == x.MachineID));
于 2013-01-07T07:18:01.007 に答える
19

DownloadTask上書きEqualsしてGetHashCode正しく?その場合、必要なのは次のとおりです。

list1 = list1.Intersect(list2).ToList();

もちろん、新しいリストを作成してよろしければの話ですが。それらを既存のリストから本当に削除したい場合は、少し難しくなります。結果がどのように見えるべきかを考え出し、クリアして再度追加するのがおそらく最も簡単でしょう:

var newList = list1.Intersect(list2).ToList();
list1.Clear();
list1.AddRange(newList);

もちろん、これに平等を適切に実装する必要がありますが、まだ実装していない場合は、実装するDownloadTaskことをお勧めします。(または、少なくともIEqualityComparer<DownloadTask>どこかに実装します。比較子を に渡すことができますIntersect。)

補足として、私は「 「含まれていないすべての要素を削除する」よりも問題を見る簡単な方法として、「含まれlist1ている要素のみを保持するlist2」(つまり、交差点)と考えています。後者は基本的に二重ですネガティブで、いつもちょっとした痛みです。list1list2

于 2013-01-07T07:19:19.613 に答える
5
  var lst = (from lst1 in list1 
             where !list2.Any(
                               x => x.OperationID == lst1.OperationID && 
                                    x.MachineID == lst1.MachineID )
             select lst1).ToList();

  list1 = lst.ToList();

これを試してみてください。

于 2013-01-07T07:33:14.303 に答える