linq 从两个集合中选择不同的对象

zqdjd7g9  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(145)

我有以下几类:

struct UserRecord
{
    //--- common settings
    int               login;                      // login
    int               leverage;                   // leverage
    int               enable;                     // enable
}

我有两个清单:

List<UserRecord> base_data = new List<UserRecord>();

base_data.Add(new UserRecord(){login = 1, leverage = 1000, enable = 0});
base_data.Add(new UserRecord(){login = 2, leverage = 100, enable = 0});
base_data.Add(new UserRecord(){login = 3, leverage = 10, enable = 1});
base_data.Add(new UserRecord(){login = 4, leverage = 10000, enable = 0});

List<UserRecord> snapshot_data= new List<UserRecord>();

snapshot_data.Add(new UserRecord(){login = 1, leverage = 1000, enable = 1});
snapshot_data.Add(new UserRecord(){login = 2, leverage = 100, enable = 0});
snapshot_data.Add(new UserRecord(){login = 3, leverage = 10, enable = 1});
snapshot_data.Add(new UserRecord(){login = 4, leverage = 10000, enable = 1});

我的目标是筛选记录,并在新列表中获得两个记录,这两个记录具有不同的字段,在本例中只有字段“enable”不同。

var filtered_data = new List<UserRecord>(); // here records with login 1 and 4 should go.

你有什么建议吗?

5vf7fwbs

5vf7fwbs1#

您可以从 * System.Linq * 中查找Enumerable.Except(),以找出这两个可枚举对象之间的区别。

using System.Linq;

List<UserRecord> filter_data = base_data.Except(snapshot_data)
            .ToList();

Demo @ .NET Fiddle
另一种方法是,如果您只想基于不同列表中具有相同loginleverage的项来比较enable中的差异。
您需要通过键联接两个列表,并使用不同的enable值从第一个列表中查询记录。

List<UserRecord> filter_data = (from a in base_data
                                join b in snapshot_data on new { a.login, a.leverage } equals new { b.login, b.leverage }
                                where a.enable != b.enable
                                select a
                                ).ToList();

Demo Solution 2 @ .NET Fiddle

相关问题