Linq的一些很方便的方法
Aggregate
Aggregate我用的最多的地方就是拼接字符串,打个比方来说,如果有数组,想要的结果是在他们之间插入一个","然后返回拼接以后的新字符串。
常规的做法是:
List<int> intList = new List<int>() { , , , , };
Console.WriteLine(string.Join(",", intList));
得到的结果是:
,,,,
但是如果碰到想要的结果是'1','2','3','4','5'这样的字符串后,在用join这个方法就不好搞了。然而用for或者foreach一样可以很简单的 就实现效果了
List<string> strList = new List<string>() {"a","b","c","d","e" };
string tmp = string.Empty;
foreach (string str in strList)
{
tmp += "'" + str + "',";
}
Console.WriteLine(tmp.Trim(','));
但是啊,这样写太土了。现在就可以用Aggregate方法来实现。
List<string> strList = new List<string>() { "a", "b", "c", "d", "e" };
tmp=strList.ToArray().Aggregate("",(c, i) => c + ("'" + i + "',")).Trim(',');
Console.WriteLine(tmp);
最后得到的结果就是:
'a','b','c','d','e'
Except
Except是求集合之间的差集。直接上代码
static void Main(string[] args)
{ List<string> strList1 = new List<string>() { "a", "b", "c", "d", "e" }; List<string> strList2 = new List<string>() { "a", "b", "e", "f", "g" };
string tmp = string.Empty; tmp=strList1.Except(strList2).Aggregate("",(i,c)=>i+" "+c);
Console.WriteLine("实例方法调用Except查询strList1不存在strList2中的数据:{0}",tmp); tmp = strList2.Except(strList1).Aggregate("", (i, c) => i + " " + c);
Console.WriteLine("实例方法调用Except查询strList2不存在strList1中的数据:{0}", tmp); tmp = Enumerable.Except(strList1, strList2).Aggregate("", (i, c) => i + " " + c);
Console.WriteLine("Enumerable静态方法调用Except查询strList2不存在strList1中的数据:{0}", tmp);
}
直接结果:
那再来看看这个例子:
执行结果会是什么?张三?
class Program
{
static void Main(string[] args)
{
string tmp = string.Empty; List<Item> objList1 = new List<Item>() { };
objList1.Add(new Item { Key = "a", Name = "张三" });
objList1.Add(new Item { Key = "b", Name = "李四" });
objList1.Add(new Item { Key = "c", Name = "王五" }); List<Item> objList2 = new List<Item>() { };
objList2.Add(new Item { Key = "b", Name = "李四" });
objList2.Add(new Item { Key = "c", Name = "王五" });
objList2.Add(new Item { Key = "d", Name = "赵六" }); tmp = Enumerable.Except(objList1, objList2).Select(item => item.Name).Aggregate("", (i, c) => i + " " + c);
Console.WriteLine("Enumerable静态方法调用Except查询objList1不存在objList2中的数据:{0}", tmp);
}
} public class Item
{
public string Key { get; set; }
public string Name { get; set; }
}
出乎意料的是objList1集合里面的所有数据都显示出来了,这是为啥?原因很简单,因为Item是对象,对象之间的比较不想简单类型那样的“=”来判断的。
所以复杂对象之间的比较需要自定义一个比较器:
public class ItemComparer : IEqualityComparer<Item>
{
public bool Equals(Item x, Item y)
{ if (Object.ReferenceEquals(x, y)) return true;
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//return x.Key == y.Key && x.Name == y.Name;
return x.Key == y.Key;
} public int GetHashCode(Item product)
{
if (Object.ReferenceEquals(product, null)) return ; int hashProductName = product.Key == null ? : product.Key.GetHashCode(); int hashProductCode = product.Name.GetHashCode(); return hashProductName ^ hashProductCode;
}
}
然后Main方法里面Enumerable.Except方法需要加入第三个参数new ItemComparer()
tmp = Enumerable.Except(objList1, objList2,new ItemComparer()).Select(item => item.Name).Aggregate("", (i, c) => i + " " + c);
再来看看执行结果:
这样就对了!
未完....
Linq的一些很方便的方法的更多相关文章
- Eclipse解决Ctrl+c很卡的方法
问题如下 : 每当在eclipse中开发java项目打开jsp页面编辑的时候,按了ctrl+c就会卡死几秒的状态,一天经常这样会让人非常的烦躁. 解决方法如下: Eclipse -- Windows- ...
- [转]win7下apache2.4响应很慢解决方法
win7下apache2.4响应很慢解决方法 PS.按照以下方法测试了以下,似乎确实快了一点[skysowe] 转载自: http://blog.sina.com.cn/s/blog_75ad1010 ...
- Repeater为空时显示“暂无数据”,很方便实用方法
Repeater为空时显示“暂无数据”,很方便实用方法 <FooterTemplate> <asp:Label ID="lblEmptyZP" Text=&q ...
- LINQ学习系列-----1.3 扩展方法
这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性. 一.扩展方法介绍 废话不多说,先上源码截图: 上图中Ge ...
- Linq中string转int的方法
Linq中string转int的方法 在做批量删除时,需把一串id值所对应的数据删除,调试出现问题: Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误 ...
- entity framework 删除数据库出现错误的解决方法--最土但是很有效的方法
无法删除数据库,因为该数据库当前正在使用. public ChinaerContext() : base("name=ContextConn") { // Database.Set ...
- Linq 分页不可缺少的两个方法
//LINQ分页的方法 //1.获取总页数 public int GetPageCount(int pageSize)//pageSize是每页的行数 { //先查出总共有多少行 int rowCou ...
- Linq lamda表达式Single和First方法
让我们来看看如何对一个整数数组使用 Single 操作符.这个整数数组的每个元素代表 2 的 1 到 10 次方.先创建此数组,然后使用 Single 操作符来检索满足 Linq Lambda表达 ...
- [MySQL优化案例]系列 — slave延迟很大优化方法
备注:插图来自网络搜索,如果觉得不当还请及时告知 :) 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以In ...
随机推荐
- Netty系列之Netty百万级推送服务设计要点
1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...
- 协程、异步IO
协程,又称微线程,纤程.英文名Coroutine,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器 ...
- Managing a node remotely by using the netapp SP
Managing a node remotely by using the Service Processor The Service Processor (SP) is a remote manag ...
- Mysql无法创建外键的原因
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- Scss开发临时学习过程
SCSS语法: 假设变量申明带有!default,那么如果在此申明之前没有这个变量的申明,则用这个值,反之如果之前有申明,则用申明的值. ‘...’传递多个参数: @mixin box-shadow( ...
- HBase配置性能调优(转)
因官方Book Performance Tuning部分章节没有按配置项进行索引,不能达到快速查阅的效果.所以我以配置项驱动,重新整理了原文,并补充一些自己的理解,如有错误,欢迎指正. 配置优化 zo ...
- 关于Winform 2.0以后多线程不能更新UI的办法
DotNet 2.0以后Winform在多线程Debug模式下更新UI会报这个错: 线程间操作无效: 从不是创建控件"XXX"的线程访问它. 解决办法如下: 1.在Winform的 ...
- Spark算上下基线
def baseLine(sc: SparkContext): Unit = { println("--------------------baseLine start----------- ...
- iOS5.0以上使用新浪微博开放平台OAuth 续(及解决登录无效问题)
新浪微博开放平台为第三方应用提供了简便的合作模式,满足了手机用户和平板电脑用户随时随地分享信息的需求.通过调用平台的api即可实现很多微博上的功能. 本篇主要目的是记录新浪微博移动SDK iOS版本的 ...
- Java 反射 getDeclareFields getModifiers setAccessible(true)
示例代码: public static Map<String, Object> dtoToMap(Object obj, String pre, String las ...