linq联合查询两个相同表并去重?

Nick_Ngai 2020-08-06 11:13:29
数据结构如下:
List<AppInfo> OldApps = new List<AppInfo>();
OldApps.Add(new AppInfo { AppName = "a", AppVersion = "1", AppType = "1" });
OldApps.Add(new AppInfo { AppName = "b", AppVersion = "1" , AppType = "1" });
OldApps.Add(new AppInfo { AppName = "c", AppVersion = "1" , AppType = "1" });
OldApps.Add(new AppInfo { AppName = "d", AppVersion = "1" , AppType = "1" });
OldApps.Add(new AppInfo { AppName = "e", AppVersion = "1" , AppType = "1" });
OldApps.Add(new AppInfo { AppName = "f", AppVersion = "1" , AppType = "1" });
OldApps.Add(new AppInfo { AppName = "g", AppVersion = "1", AppType = "1" });

List<AppInfo> NewApps = new List<AppInfo>();
NewApps.Add(new AppInfo { AppName = "a", AppVersion = "1" , AppType = "1" });
NewApps.Add(new AppInfo { AppName = "b", AppVersion = "2" , AppType = "1" });
NewApps.Add(new AppInfo { AppName = "c", AppVersion = "1" , AppType = "1" });
NewApps.Add(new AppInfo { AppName = "d", AppVersion = "1", AppType = "1" });
NewApps.Add(new AppInfo { AppName = "e", AppVersion = "1" , AppType = "1" });
NewApps.Add(new AppInfo { AppName = "f", AppVersion = "2" , AppType = "1" });
NewApps.Add(new AppInfo { AppName = "h", AppVersion = "1", AppType = "1" });
NewApps.Add(new AppInfo { AppName = "i", AppVersion = "1", AppType = "1" });

有这样两个列表,我想用linq联合查询NewApps和OldApps两个列表,有三种情况如下:
1. 如果NewApps中记录在OldApps中已经存在了(AppName和AppVersion相同),则不需要查出来。
2. 如果NewApps中记录在OldApps中存在AppName相同,但AppVersion不同,则查出NewApps中记录,并将AppType设置为“2”。
3. 如果OldApps中AppName在NewApps中找不到记录,则查出OldApps记录,并将AppType设置为“0”。

想问下怎么样写出这个linq语句?
...全文
2503 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nick_Ngai 2020-08-06
  • 打赏
  • 举报
回复
引用 1 楼 正怒月神 的回复:
查找差集 并且重写比较方法。
List<User> u1 = new List<User>() { new User() { ID = 1, Name = "1" } , new User() { ID = 2, Name = "2" }, new User() { ID = 3, Name = "3" }, new User() { ID = 5, Name = "5" }, }; u1增加个ID=5, u2中没有这个,怎么查出来? var q2 = u1.Except(u2, new MyCompare()).ToList(); 只能增加个查询,再合并两个查询吗?
正怒月神 2020-08-06
  • 打赏
  • 举报
回复
补个例子
static void Main(string[] args)
        {
            List<User> u1 = new List<User>() { 
                new User() { ID = 1, Name = "1" } ,
                new User() { ID = 2, Name = "2" },
                new User() { ID = 3, Name = "3" },
            };

            List<User> u2 = new List<User>() {
                new User() { ID = 1, Name = "1" } ,     //相同记录
                new User() { ID = 2, Name = "2.1" },    //版本不同
                new User() { ID = 3, Name = "3" },      //相同记录
                new User() { ID = 4, Name = "4" },      //新纪录
            };

            var q = u2.Except(u1,new MyCompare()).ToList();

            Console.ReadLine();
        }

        public class MyCompare : IEqualityComparer<User>
        {
            public bool Equals(User x, User y)
            {
                if (x.ID == y.ID && x.Name == y.Name)
                    return true;
                return false;
            }

            public int GetHashCode(User obj)
            {
                return (obj.ID+obj.Name).GetHashCode();
            }
        }

        public class User
        {
            public int ID { get; set; }
            public string Name { get; set; }
            
        }
正怒月神 2020-08-06
  • 打赏
  • 举报
回复
查找差集 并且重写比较方法。
正怒月神 2020-08-06
  • 打赏
  • 举报
回复
引用 3 楼 Nick_Ngai 的回复:
[quote=引用 1 楼 正怒月神 的回复:]查找差集 并且重写比较方法。
List<User> u1 = new List<User>() { new User() { ID = 1, Name = "1" } , new User() { ID = 2, Name = "2" }, new User() { ID = 3, Name = "3" }, new User() { ID = 5, Name = "5" }, }; u1增加个ID=5, u2中没有这个,怎么查出来? var q2 = u1.Except(u2, new MyCompare()).ToList(); 只能增加个查询,再合并两个查询吗?[/quote] 那可以先使用 Intersect 求交集。 然后两边都和这个交集比较。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧