【问题标题】:C# generic list compare and get unmatched rowsC# 通用列表比较并获取不匹配的行
【发布时间】:2019-03-22 21:33:18
【问题描述】:

我在 C# 中有两个列表。我需要一个 LINQ 查询来比较和列出不匹配的行。

List<First> firstList;
List<Second> secondList;
both have the unique property called ID;

第一个列表:

ID  Desc1   Desc2           
1   aaa     mmm             
2   bbb     fff             
3   ccc     ttt   
4   ddd     yyy
5   eee     ggg

第二个列表:

ID  Desc1   Desc2   Status          
1   aaa     mm      P       
2   bbb     fff     S       
3   ccc     ttt     P   
4   ddd     yy      S
5   eee     ggg     P

结果:

ID  Desc1   Desc2   Status
2   aaa     mm      P
4   ddd     yy      S

我想将 firstList 中的 Desc1 和 Desc2 与 secondList 进行比较,并且需要不匹配项的状态。

【问题讨论】:

  • 你是怎么做到的?你被困在哪里了?
  • 我需要通过比较多个字段来查找不匹配行的状态。我正在学习 C#,不知道如何实现。
  • 如果我们可以为您提供即用型解决方案,那么学习因素并不大,对吗?这就是为什么这个网站不能这样工作,你必须提供你的尝试并提供关于你在哪里具体卡住的信息。你也应该看看stackoverflow.com/help/how-to-ask
  • 您要求的是两个列表之间的区别。这个问题已经回答了。见stackoverflow.com/questions/5636438/…
  • 不幸的是我的视觉工作室崩溃了,我以后会注意的。

标签: c# list compare


【解决方案1】:

一些查找结果的方法(lambda、linq):

var query0 = secondList.Where(item => firstList.All(f => !item.Desc1.Equals(f.Desc1)  || !item.Desc2.Equals(f.Desc2)));

var query1 =
    from item in secondList
    where firstList.All(f => !item.Desc1.Equals(f.Desc1) || !item.Desc2.Equals(f.Desc2))
    select item;

如果您希望结果是列表而不是枚举,您只需在末尾添加 Tolist():

var list0 = secondlist.Where(item => firstlist.All(f => !item.Desc1.Equals(f.Desc1) || !item.Desc2.Equals(f.Desc2))).ToList();

在评论中回答您的问题:

如果你想迭代或选择一个特定的ID,你可以这样做:

        foreach(var item in query0)
        {
           Console.WriteLine($"ID:{item.ID}, Desc1:{item.Desc1}, Desc2:{item.Desc2}, Status:{item.Status}");  
        }

        //if you want to query a particular id:
        var queryid = query0.Where(item => item.ID == particularID);

【讨论】:

  • 嗨 Frenchy,如果我想在您提供的 linq 查询中查询任何特定 ID,我该如何实现这一点
  • 感谢 Frenchy 的宝贵帮助
  • 请不要忘记验证答案,如果可以的话
【解决方案2】:

请见下文。您需要在两个列表之间进行联合,然后删除交集。您需要实现 IEqualityComparer 接口。

void Main()
{
    List<UserProfile> u1 = new List<UserQuery.UserProfile>(){
        new UserProfile(){ID = 1, FirstName  = "Super" , LastName = "Man"},
        new UserProfile(){ID=2, FirstName = "Spider", LastName="Man"},
        new UserProfile(){ID=3, FirstName = "Bat", LastName="Man"}
    };

    List<UserProfile> u2 = new List<UserProfile>(){
        new UserProfile(){ID = 1, FirstName="Super", LastName="Man"},
        new UserProfile(){ID = 2, FirstName="Thor", LastName="Ragnarok"},
        new UserProfile(){ID = 3, FirstName="Hulk", LastName="Baner"}
    };

//  u1.Intersect(u2, new UserProfileComparer())
//      .ToList()
//      .ForEach(x => Console.WriteLine(x.Name));

//  u1.Except(u2, new UserProfileComparer())
//      .ToList()
//      .ForEach(x => Console.WriteLine(x.Name));

    // (u1 + u2) - (u1*u2)
    u1.Union(u2, new UserProfileComparer())
        .Except(u1.Intersect(u2, new UserProfileComparer()))
        .Distinct()
        .ToList()
        .ForEach(x => Console.WriteLine(x.Name));
}

class UserProfile
{
    public int ID {get;set;}
    public string Name => LastName + "," + FirstName;
    public string FirstName {get;set;}
    public string LastName {get;set;}
}

class UserProfileComparer : IEqualityComparer<UserProfile>
{
    public bool Equals(UserProfile item1, UserProfile item2)
    {
        if (object.ReferenceEquals(item1, item2))
            return true;
        if (item1 == null || item2 == null)
            return false;
        return item1.FirstName.Equals(item2.FirstName) &&
               item1.LastName.Equals(item2.LastName);
    }

    public int GetHashCode(UserProfile item)
    {
        return new { item.FirstName, item.LastName }.GetHashCode();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多