从两个具有多个属性的列表中删除重复项

本文关键字:列表 删除 属性 两个 | 更新日期: 2023-09-27 18:18:44

我想在现有数据库中插入随机元素。在插入这些随机元素之前,我必须检查它们是否已经存在于数据库中(主键)。我想要添加一个额外的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#中枚举),但对我来说,整个表达式看起来很可怕。>

第二个解决方案(最后一行代码)不存在,但类似的东西会很好。

我希望你有更好的解决方案,我想和LINQ合作。性能是次要的。

我想合并两个列表并按主键对它们分组,但是随后我必须删除已经在databaseList中的元素,但是我如何知道哪些元素在databaseList中呢?

总是有上百种方法来解决这个问题,至少我找到了一个(第一个解决方案与变通),但也许有一个更优雅的方法。

从两个具有多个属性的列表中删除重复项

对于那些正在寻找一个完整的解决方案。特别感谢克里斯托!

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子句有多列

EDIT:没有必要先提取密钥。可以使用完整的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));