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 = , color = "", name = "name1", price = ,time="时间" },
new date() { id = , color = "", name = "name2", price = ,time="时间" },
new date() { id = , color = "", name = "name3", price = ,time="时间" },
new date() { id = , color = "", name = "name5", price = ,time="时间" },
new date() { id = , color = "", name = "name8", price = ,time="时间" }
};
List<date> list2 = new List<date>()
{
new date() { id = , color = "修改", name = "修改", price = ,time="时间" },
new date() { id = , color = "增加", name = "增加", price = ,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这个方法的使用,该方法还有很多种用法,这里就举个例子而已啦
源码下载地址为:http://files.cnblogs.com/xmfdsh/Lambda%E4%BB%A5%E5%8F%8A%E6%AF%94%E8%BE%83%E5%99%A8.zip
Lambda加自定义比较器实现两个列表的合并的更多相关文章
- python 如何在一个for循环中遍历两个列表
是我在看<笨方法学python>过程中发现有一行代码看不懂--" for sentence in snippet, phrase:",所以研究了半天,感觉挺有收获的.所 ...
- EntityFramework Core 2.0自定义标量函数两种方式
前言 上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式.本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数. 自定义标量函数两种方式 在EF Core 2.0中我们可以将 ...
- python两个列表合并为字典,一个作为key,一个作为value
两个列表合并为一个字典函数list_dic(list1,list2)可以直接复制拿走 传入的参数为两个列表,list1准备作为key,list2准备作为value,key和value位置一一对应. d ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)
接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)
Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...
- 通知url必须为直接可访问的url,不能携带参数 异步接收微信支付结果通知的回调地址 不能携带参数。 回调地址后是否可以加自定义参数 同步回调地址 异步回调地址 return_url和notify_url的区别
[微信支付]微信小程序支付开发者文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7 通知url必须为直接可访问的 ...
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
- 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器
最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...
- 自定义比较器(IComparer接口的实现)
class FileNameSort : IComparer { [System.Runtime.InteropServices.DllImport("Shlwapi.dll", ...
随机推荐
- thinkphp 读取页面报错 说 /Runtime/Cache/Home/XXXXXX.php 错误
thinkphp _STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/xxxx.php 这一种报错一般是在linux 才会出现的错误,因为是权限问题.把Home文件加 ...
- TaskTracker学习笔记
转自:http://blog.csdn.net/androidlushangderen/article/details/41477061 上次分析完JobTracker通过TaskScheduler如 ...
- 【vijos】1447 开关灯泡(高精度+特殊的技巧)
https://vijos.org/p/1447 一开始想了想似乎只想到了与约数个数有关,即约数个数为奇数那么显然是亮的. 竟然没想到完全平方数..sad.. 在正因子中,只有完全平方数的正因子才是奇 ...
- js常用API汇总(转)
typeof(); 检测数据类型 String(); 转换成字符串 parseInt(); 解析出一个string或number的整数部分 parseFloat(); 解析出一个string的浮点数部 ...
- ChemDraw Pro移动原子有什么方法
很多的用户朋友在使用ChemDraw Pro 14过程中,会发现我们用[文本]工具在我们绘制的化学结构上建立原子符号和说明时一些标记的原子名称会显得拥挤,这个时候我们可以通过移动原子的方式来把空间放大 ...
- Echoprint系列--编译
近期要做一个音乐相关的client.当中一个功能是音乐识别.搜索了一些资料选择Echoprint来开发.Echoprint是开源免费的,并且多种client都支持能节约非常多时间,今天主要下载和编译源 ...
- 两天学会DirectX 3D之第二天
提要 前几天非常easy地跑了一个DirectX 9 程序,以为DirectX就那么绘制,事实证明有点Naive了. 之前的那个程序最多也就是个固定流水线的东西. 可是今天要用DirectX11来写一 ...
- Google I/O 2013 – Volley: Easy, Fast Networking for Android
1.什么是volley Volley是Ficus Kirpatrick在Gooogle I/O 2013发布的一个处理和缓存网络请求的库,能使网络通信更快,更简单,更健壮.Volle ...
- DTD的学习和理解
看log4j的官方文档,上面说提供了XML格式的配置,但是没有XML具体示例.发现文档中说的是一个DTD文档,但我根本不知道DTD是什么,于是就简单了解一下.顺带做一下笔记. 注:结合笔记看log4j ...
- Python设置默认编码为UTF-8
1.在Python\Lib\site-packages目录下创建一个sitecustomize.py文件 源代码: import sys sys.setdefaultencoding('utf-8') ...