私は作家のリストを持っています。
public class Writers{
long WriterID { get;set; }
}
また、Articleタイプのリストが2つあります。
public class Article{
long ArticleID { get; set; }
long WriterID { get; set; }
//and others
}
だから私が持っているコードは:
List<Article> ArticleList = GetList(1);
List<Article> AnotherArticleList = AnotherList(2);
List<Writers> listWriters = GetAllForbiddenWriters();
ArticleList
、AnotherArticleList
からそれらのレコードを削除したいのですが、WriterID
はlistWriters
WriterID
から一致します。 LINQでこれを行う方法は?
実際にList<T>
、 List<T>.RemoveAll
、一連のライターIDを作成した後:
HashSet<long> writerIds = new HashSet<long>(listWriters.Select(x => x.WriterID));
articleList.RemoveAll(x => writerIds.Contains(x.WriterId));
anotherArticleList.RemoveAll(x => writerIds.Contains(x.WriterId));
LINQを使用したいdoの場合、次を使用できます。
articleList = articleList.Where(x => !writerIds.Contains(x.WriterId))
.ToList();
anotherArticleList = anotherArticleList
.Where(x => !writerIds.Contains(x.WriterId))
.ToList();
これはvariableを変更しますが、既存のリストを変更しないことに注意してください-同じリストへの他の参照がある場合、それらは表示されません変更。 (一方、RemoveAll
は既存のリストを変更します。)
articlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));
anotherArticlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));
単なる設計のヒントです。クラスは、Writer
(複数形)ではなく、Writers
(単数形)と呼ぶ必要があります。リスト内の各項目は、1人の作家を表しています。
あなたが直面している難しさは本当にわかりません...
単純なforループを使用して、リストからデータをフィルタリング/削除するだけではどうですか? (繰り返しオブジェクトの編集/変更中に繰り返しを行うと、foreachループは完全に機能しないことに注意してください)
for (int i = ArticleList.Count -1; i >= 0; i--)
{
for (int j = 0; j < listWriters.Count; j++)
{
if (ArticleList[i].WriterId == listWriters[j].WriterID )
ArticleList.RemoveAt(i);
}
}
バックワードイテレーショントリックは、「繰り返しながらアイテムを削除する」パラダイムを解決します。
Except を使用できます。
List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();