【发布时间】:2014-08-20 09:23:49
【问题描述】:
我想将随机元素插入现有数据库。在插入这些随机元素之前,我必须检查它们是否已经存在于数据库中(主键)。我不想添加额外的 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中有哪些元素。
与往常一样,有数百种方法可以解决这个问题,至少我找到了一种(第一个解决方案有变通方法),但也许有更优雅的方法。
【问题讨论】: