当前位置: 首页 > 编程笔记 >

C#中使用Lambda表达式自定义比较器实现两个列表合并实例

穆飞星
2023-03-14
本文向大家介绍C#中使用Lambda表达式自定义比较器实现两个列表合并实例,包括了C#中使用Lambda表达式自定义比较器实现两个列表合并实例的使用技巧和注意事项,需要的朋友参考一下

一次项目有这样的需求,本地存储了json数据,可以转化为对应的List列表,现在需要更新,从服务器那里获取最新的数据更改。总的来说就是本地有个List表,如果数据需要更新,则会向服务器发送请求来获取需要更改的部分List表格,然后客户端这边就要去处理合并完整这次的更新,弄了一个下午,终于搞定,这次来mark一下。

主要推送的数据的两个特性:

1.如果之前的列表需要增加,则出现在最新的数据推送List中

2.如果数据需要修改的话,则一样推送更新,保持id不变,内容有所改变

示例代码如下图:


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace test {     public class date     {         public int id { set; get; }         public string color { set; get; }         public string name { set; get; }         public decimal price { set; get; }

        public string time { get; set; }     }

    class MyComparer : IEqualityComparer<date>     {         public bool Equals(date x, date y)         {             return x.id == y.id;         }

        public int GetHashCode(date obj)         {             return obj.id.GetHashCode();         }     }

    class Program     {         static void Main(string[] args)         {             List<date> list1 = new List<date>()             {                 new date() { id = 1, color = "1", name = "name1", price = 1,time="时间" },                 new date() { id = 2, color = "2", name = "name2", price = 2,time="时间" },                 new date() { id = 3, color = "3", name = "name3", price = 3,time="时间" },                 new date() { id = 5, color = "5", name = "name5", price = 5,time="时间" },                 new date() { id = 6, color = "6", name = "name8", price = 8,time="时间" }             };             List<date> list2 = new List<date>()             {                 new date() { id = 1, color = "修改", name = "修改", price = 2,time="时间" },                 new date() { id = 8, color = "增加", name = "增加", price = 2,time="时间" }             };             var result = list2.Union(list1, new MyComparer());             foreach (var item in result)             {                 Console.WriteLine("id = {0}, card = {1}, name = {2}, price = {3}", item.id, item.color, item.name, item.price,item.time);             }         }     } }

测试的结果为:

从结果看出,id=1的数据需要修改,所以最新生成的List表中id为1的所有属性都是更改后的结果,而在list1中没有id为8的数据,说明这个是需要新增进去的一条记录,因此在最新的List也有了,这次主要用到自定义的比较器,去实现IEqualityComparer<>这个接口。另外还用到了Lambda表达式

var result = list2.Union(list1, new MyComparer());特别是Union这个方法的使用,该方法还有很多种用法,这里就举个例子而已啦。

 类似资料:
  • 本文向大家介绍Python实现比较两个列表(list)范围,包括了Python实现比较两个列表(list)范围的使用技巧和注意事项,需要的朋友参考一下 有一道题: 比较两个列表范围,如果包含的话,返回TRUE,否则FALSE。 详细题目如下: Create a function, this function receives two lists as parameters, each list i

  • 本文向大家介绍Java中使用Lambda表达式实现IntBinaryOperator,包括了Java中使用Lambda表达式实现IntBinaryOperator的使用技巧和注意事项,需要的朋友参考一下 IntBinaryOperator 是Java 8 中java.util.function包中的功能接口。该接口需要两个int类型的参数作为输入, 并产生一个int类型的结果。IntBinaryO

  • 问题内容: 我正在浏览Java源代码中的接口,并遇到了以下这段代码: 从方法声明中,我知道这是一个通用方法,该方法返回一个Comparator类型,该Comparator类型可以从传递给它的映射条目中推断出来,也可以在该方法中明确提供。 真正让我失望的是返回值。似乎lambda表达式 被显式转换为。这是正确的吗? 我还注意到,表观演员包括。我之前从未见过将接口与类组合在一起的类型,但是在编译器中它

  • 我在查看接口的Java源代码时,遇到了以下代码片段: 从方法声明中,我得到这是一个通用方法,它返回一种类型的比较器,这种比较器要么是从传递给它的映射条目中推断出来的,要么是在方法中显式提供的。 真正让我恼火的是返回值。看来λ表达式 显式转换为 ?有人能澄清这一切吗?

  • P.S.如果您将这两行代码作为结果所做的事情添加进去,那将是非常感谢的。

  • 我有以下代码: 现在,我有两个房屋列表和,这两个列表都填充了相同的房屋元素,但是嵌套的列表房屋任务在newHouse中更新了一个额外的任务。 如何获得一个新的列表,该列表包含通过Java8流添加的任务? 这一直在破坏我的大脑,我似乎无法让它工作。