【问题标题】:Select different objects from two collections in C# LINQ从 C# LINQ 中的两个集合中选择不同的对象
【发布时间】:2022-08-18 14:49:34
【问题描述】:

我有以下课程:

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});

我的目标是过滤记录,并在新列表中获取两条记录,它们具有不同的字段,在这种情况下,只有字段“启用”不同。

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

你有什么建议吗 ?

    标签: c# linq


    【解决方案1】:

    您可以从以下位置寻找Enumerable.Except()System.Linq找出两个可枚举之间的差异。

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

    Demo @ .NET Fiddle


    另一种方法是,如果您只想根据不同列表中具有相同loginleverage 的项目比较enable 的差异。

    你需要加入通过loginleverage 列出两个列表,并从具有不同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

    【讨论】:

    • 那么除了会比较所有领域吗?
    • @pewocis495通过使用默认的相等比较器来比较值。,但是如果需要,可以提供您自己的相等比较器。请参阅文档。
    • @ pewocis495 “所以除了会比较所有字段吗?”,如果你看一下小提琴显然它会比较它的字段
    【解决方案2】:

    你可以使用这个 linq 来得到你想要的:

        List<UserRecord> filter_data = base_data
           .Where(x => !snapshot_data.Any(y => 
            y.login == x.login && 
            y.Leverage == x.Leverage && 
            y.enable == x.enable))
            .ToList();
    

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 2015-11-16
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-06-03
      • 2022-11-30
      • 2018-11-13
      相关资源
      最近更新 更多