私は、アイテムの別のリストから削除したいアイテムの一般的なリストをトラバースする方法を見つけようとしています。
だから私はこれを仮説の例として持っているとしましょう
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
Foreachでlist1をトラバースし、List2にも含まれているList1の各アイテムを削除します。
Foreachはインデックスベースではないため、その方法についてはよくわかりません。
Except を使用できます。
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();
おそらく、これらの一時変数さえ必要ないでしょう:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
Except
はどちらのリストも変更しないことに注意してください-結果で新しいリストを作成します。
List<T>
クラスでは、Remove
関数を使用して、インデックスではなく値で項目を削除できるため、インデックスは必要ありません。
foreach(car item in list1) list2.Remove(item);
LINQ拡張メソッド を使用することをお勧めします。次のような1行のコードで簡単に実行できます。
list2 = list2.Except(list1).ToList();
もちろん、list2から削除するlist1のオブジェクトは同じインスタンスであると仮定しています。
私の場合、外部キーのような、共通の識別子を持つ2つの異なるリストがありました。 "nzrytmn"が引用する2番目の解決策:
var result = list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();
私の状況に最適なものでした。すでに登録されているレコードなしでDropDownListをロードする必要がありました。
ありがとうございました !!!
これは私のコードです:
t1 = new T1();
t2 = new T2();
List<T1> list1 = t1.getList();
List<T2> list2 = t2.getList();
ddlT3.DataSource= list2.Where(s => !list1.Any(p => p.Id == s.ID)).ToList();
ddlT3.DataTextField = "AnyThing";
ddlT3.DataValueField = "IdAnyThing";
ddlT3.DataBind();
LINQを使用できますが、RemoveAll
メソッドを使用します。それがあなたの意図をよりよく表現していると思います。
var integers = new List<int> { 1, 2, 3, 4, 5 };
var remove = new List<int> { 1, 3, 5 };
integers.RemoveAll(i => remove.Contains(i));
list1.RemoveAll(l => list2.Contains(l));
解決策1:このようにすることができます:
List<car> result = GetSomeOtherList().Except(GetTheList()).ToList();
ただし、場合によっては、このソリューションが機能しないことがあります。うまくいかない場合は、2番目のソリューションを使用できます。
解決策2:
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
list1がメインリスト、list2がセカンドリーリストであり、list2のアイテムなしでlist1のアイテムを取得するとします。
var result = list1.Where(p => !list2.Any(x => x.ID == p.ID && x.property1 == p.property1)).ToList();