gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:24:43 28 4
gpt4 key购买 nike

我想将随机元素插入现有数据库中。在插入这些随机元素之前,我必须检查它们是否已存在于数据库中(主键)。我不想添加额外的 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);

第一个解决方案不起作用,因为我想在枚举期间删除元素。我可以通过解决方法( Intelligent way of removing items from a List<T> while enumerating in C# )解决这个问题,但对我来说整个表达式看起来很糟糕。

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

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

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

一如既往,有数百种方法可以解决这个问题,至少我找到了一种(第一个解决方案和解决方法),但也许有一种更优雅的方法。

最佳答案

适合那些正在寻找完整解决方案的人。特别感谢@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 clause with multiple columns

编辑:没有必要先提取 key 。可以使用完整的数据库列表而不是键。

关于C# 从具有多个属性的两个列表中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25401147/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com