web-dev-qa-db-ja.com

基準を使用して別のリストからリストのアイテムを削除する

私は作家のリストを持っています。

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();

ArticleListAnotherArticleListからそれらのレコードを削除したいのですが、WriterIDlistWritersWriterIDから一致します。 LINQでこれを行う方法は?

48
developer

実際に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は既存のリストを変更します。)

94
Jon Skeet
articlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));
anotherArticlesList.RemoveAll(a => listWriters.Exists(w => w.WriterID == a.WriterID));
44
bitxwise

単なる設計のヒントです。クラスは、Writer(複数形)ではなく、Writers(単数形)と呼ぶ必要があります。リスト内の各項目は、1人の作家を表しています。

1
danijels

あなたが直面している難しさは本当にわかりません...

単純な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);
    }            
}

バックワードイテレーショントリックは、「繰り返しながらアイテムを削除する」パラダイムを解決します。

1
Mehdi LAMRANI

Except を使用できます。

List<car> list1 = GetTheList();
List<car> list2 = GetSomeOtherList();
List<car> result = list2.Except(list1).ToList();
0
bestinamir