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

C#从两个具有多个属性的列表中删除重复项,c#,linq,merge,union,C#,Linq,Merge,Union,我想在现有数据库中插入随机元素。在插入这些随机元素之前,我必须检查它们是否已经存在于数据库中(主键)。我不想添加额外的ID属性 因此,我希望获取重复的主键,但只获取重复的主键,因此.Union()不起作用 以下是两种解决方案: var databaseList = database.Repository.GetAllElements(); foreach (var element in listOfRandomElements.Where(element => databaseList.F

我想在现有数据库中插入随机元素。在插入这些随机元素之前,我必须检查它们是否已经存在于数据库中(主键)。我不想添加额外的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);
第一个解决方案不起作用,因为我想在枚举期间删除元素。我可以用变通方法()解决这个问题,但对我来说,整个表达式看起来很糟糕

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

我希望你有更好的解决方案,我愿意与LINQ合作。表现是次要的

我曾考虑合并两个列表并按主键对它们进行分组,但随后我必须删除数据库列表中的元素,但我如何知道哪些元素在数据库列表中


像往常一样,解决这个问题的方法有数百种,在leat我找到了一种(第一种解决方法是解决问题),但也许有一种更优雅的方法。

最初,你可以列出你已经拥有的所有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 ));
在此处找到提示:


编辑:无需先提取关键帧。可以使用完整的数据库列表而不是键。

使用
哈希集
比使用列表更好。thx!这看起来是一个更具可读性的解决方案,但出于模块化的原因,我不想立即插入它们,只想删除它们。(与我的第一个解决方案中的问题相同)。@Olli1511 allrighth。您可以在
if
语句中执行此操作,前提是您将更改
id.Any
的否定。我认为这将导致InvalidOperationException,因为您想在枚举时删除元素->与我的解决方案中相同的问题->需要解决方法。@Christos Thx!我忘记了.Contains()方法。现在我只需要添加多个属性(复合主键),但我可以自己做!谢谢你的帮助。