【问题标题】:Easiest way of comparing two lists in C# with LINQ and adding missing items to Entity Class将 C# 中的两个列表与 LINQ 进行比较并将缺失项添加到实体类的最简单方法
【发布时间】:2023-03-20 12:50:02
【问题描述】:

我的 C# 应用程序中有两个列表,如下所示(名称):

- prepared
- DBList

TransactionDetails 类型的准备列表包含我需要在 DBList 中添加的缺失项。

例如,如果我在准备好的列表中有这些项目,如下所示:

TransactionID

1
2
3
4
5
6
7
8
9

我的 DBList 有:

TransactionID 
1
2
3
4
5
6

我想比较这两个列表,找到不在 DBList 中的匹配 TransactionID,然后将它们添加到 DBList。之后我将清除准备好的列表并将更改保存在数据库中;

这是我到目前为止所做的:

var newList = prepared.Intersect(DBList).ToList();
prepared.Clear();
ctx.EbayUserTransactions.AddRange(newList);
ctx.SaveChanges();

但由于某种原因,newList 列表始终为空。我该如何正确执行此操作?

编辑,DBList 项目的输出将是:

  TransactionID

    1
    2
    3
    4
    5
    6
    7
    8
    9

【问题讨论】:

  • 你试过prepared.Except(DBList).ToList() 吗? DBList 是否实现 IEnumerable ?
  • @MatteoMarciano-MSCP 是的,但是 except 方法如何知道要在两个列表中比较哪个属性...我要比较它们的属性是 TransactionID
  • 对你的班级的形式没有太多线索

标签: c# asp.net asp.net-mvc linq compare


【解决方案1】:

您可以使用 LINQ:

DBList.AddRange(prepared.Where((i) => DBList.FindIndex((el) => el.Transaction.ID == i.TransactionID) == -1));

【讨论】:

  • 哇,比我想象的要简单得多。等一下,我试试这个! :)
  • 它给了我这样的异常:无法创建类型为“DB_Layer.EbayUserTransactions”的常量值。此上下文仅支持原始类型或枚举类型
  • 它告诉我没有 FindIndex 方法?
  • @User987,您的列表类型是List<TransactionDetails>?
  • 啊,DBList 是 DBSet 的类型,我只是将它放入列表中,例如:.ToList().FindIndex()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 2021-12-23
  • 1970-01-01
相关资源
最近更新 更多