簡體   English   中英

C#從具有多個屬性的兩個列表中刪除重復項

[英]C# Remove duplicates from two lists with multiple properties

我想將隨機元素插入現有數據庫中。 在插入那些隨機元素之前,我必須檢查它們是否已經存在於數據庫中(主鍵)。 不想增加額外的ID屬性。

因此,我想獲取重復項,而只獲取重復的主鍵,因此.Union()不起作用。

這是兩個解決方案:

var databaseList = database.Repository.GetAllElements();
foreach (var element in listOfRandomElements.Where(element => databaseList.Find(
                x =>
                x.Property0 == element.Property0 &&
                x.Property1 == element.Property1 &&
                x.Property2 == element.Property2)
                != null))
 {
     listOfElements.Remove(element);
 }


 listOfElements.RemoveAll(x => x.Property0 == databaseList.Select(y => true).Property0);

第一種解決方案不起作用,因為我想在枚舉期間刪除元素。 我可以使用一種解決方法( 在C#中枚舉時從List <T>刪除項目的智能方式)解決此問題,但對我來說,整個表達式看起來很恐怖。

第二種解決方案(代碼的最后一行)不存在,但是那樣的話會很棒。

希望您有更好的解決方案,我想與LINQ合作。 性能是第二級的。

我考慮過合並兩個列表並按主鍵對它們進行分組,但是隨后我不得不刪除databaseList中已有的元素,但是我如何知道databaseList中的哪些元素。

與往常一樣,有數百種方法可以解決此問題,至少我發現了一種方法(第一種具有解決方法的解決方案),但也許還有一種更優雅的方法。

最初,您可以列出已經擁有的所有ID:

var ids = data.Repository.GetAllElements().Select(x=>x.Id);

然后,您可以簡單地執行以下操作:

foreach(var element in listOfRandomElements)
{
    // Check if there isn't any id in the ids collection which is equal to element's id.
    if(!ids.Any(x=>x==element.Id)
        // Here you could insert your element.
}

更新資料

listOfRandomElements.RemoveAll(x=>ids.Contains(x.Id));

對於那些正在尋找完整解決方案的人。 特別感謝@Christos!

var databaseList = database.Repository.GetAllElements();
var keys = databaseList.Select(x => new {x.key0, x.key1, x.key2}); 

listOfElements.RemoveAll(
                x =>
                keys.Any(
                k => k.key0 == x.key0 && 
                k.key1 == x.key1 && 
                k.key2 == x.key2 ));

在此處找到提示: LINQ to Entities-具有多列的where..in子句

編輯:沒有必要先提取密鑰。 可以使用完整的databaseList代替鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM