Aggregate

Aggregate我用的最多的地方就是拼接字符串,打个比方来说,如果有数组,想要的结果是在他们之间插入一个","然后返回拼接以后的新字符串。

常规的做法是:

  1. List<int> intList = new List<int>() { , , , , };
  2. Console.WriteLine(string.Join(",", intList));

得到的结果是:

  1. ,,,,

但是如果碰到想要的结果是'1','2','3','4','5'这样的字符串后,在用join这个方法就不好搞了。然而用for或者foreach一样可以很简单的 就实现效果了

  1. List<string> strList = new List<string>() {"a","b","c","d","e" };
  2. string tmp = string.Empty;
  3. foreach (string str in strList)
  4. {
  5. tmp += "'" + str + "',";
  6. }
  7. Console.WriteLine(tmp.Trim(','));

但是啊,这样写太土了。现在就可以用Aggregate方法来实现。

  1. List<string> strList = new List<string>() { "a", "b", "c", "d", "e" };
  2. tmp=strList.ToArray().Aggregate("",(c, i) => c + ("'" + i + "',")).Trim(',');
  3. Console.WriteLine(tmp);

最后得到的结果就是:

  1. 'a','b','c','d','e'

Except

Except是求集合之间的差集。直接上代码

  1. static void Main(string[] args)
  2. {
  3.  
  4. List<string> strList1 = new List<string>() { "a", "b", "c", "d", "e" };
  5.  
  6. List<string> strList2 = new List<string>() { "a", "b", "e", "f", "g" };
  7. string tmp = string.Empty;
  8.  
  9. tmp=strList1.Except(strList2).Aggregate("",(i,c)=>i+" "+c);
  10. Console.WriteLine("实例方法调用Except查询strList1不存在strList2中的数据:{0}",tmp);
  11.  
  12. tmp = strList2.Except(strList1).Aggregate("", (i, c) => i + " " + c);
  13. Console.WriteLine("实例方法调用Except查询strList2不存在strList1中的数据:{0}", tmp);
  14.  
  15. tmp = Enumerable.Except(strList1, strList2).Aggregate("", (i, c) => i + " " + c);
  16. Console.WriteLine("Enumerable静态方法调用Except查询strList2不存在strList1中的数据:{0}", tmp);
  17. }

直接结果:

那再来看看这个例子:

执行结果会是什么?张三?

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. string tmp = string.Empty;
  6.  
  7. List<Item> objList1 = new List<Item>() { };
  8. objList1.Add(new Item { Key = "a", Name = "张三" });
  9. objList1.Add(new Item { Key = "b", Name = "李四" });
  10. objList1.Add(new Item { Key = "c", Name = "王五" });
  11.  
  12. List<Item> objList2 = new List<Item>() { };
  13. objList2.Add(new Item { Key = "b", Name = "李四" });
  14. objList2.Add(new Item { Key = "c", Name = "王五" });
  15. objList2.Add(new Item { Key = "d", Name = "赵六" });
  16.  
  17. tmp = Enumerable.Except(objList1, objList2).Select(item => item.Name).Aggregate("", (i, c) => i + " " + c);
  18. Console.WriteLine("Enumerable静态方法调用Except查询objList1不存在objList2中的数据:{0}", tmp);
  19. }
  20. }
  21.  
  22. public class Item
  23. {
  24. public string Key { get; set; }
  25. public string Name { get; set; }
  26. }

出乎意料的是objList1集合里面的所有数据都显示出来了,这是为啥?原因很简单,因为Item是对象,对象之间的比较不想简单类型那样的“=”来判断的。

所以复杂对象之间的比较需要自定义一个比较器:

  1. public class ItemComparer : IEqualityComparer<Item>
  2. {
  3. public bool Equals(Item x, Item y)
  4. {
  5.  
  6. if (Object.ReferenceEquals(x, y)) return true;
  7. if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
  8. return false;
  9. //return x.Key == y.Key && x.Name == y.Name;
  10. return x.Key == y.Key;
  11. }
  12.  
  13. public int GetHashCode(Item product)
  14. {
  15. if (Object.ReferenceEquals(product, null)) return ;
  16.  
  17. int hashProductName = product.Key == null ? : product.Key.GetHashCode();
  18.  
  19. int hashProductCode = product.Name.GetHashCode();
  20.  
  21. return hashProductName ^ hashProductCode;
  22. }
  23. }

然后Main方法里面Enumerable.Except方法需要加入第三个参数new ItemComparer()

  1. tmp = Enumerable.Except(objList1, objList2,new ItemComparer()).Select(item => item.Name).Aggregate("", (i, c) => i + " " + c);

再来看看执行结果:

这样就对了!

未完....

Linq的一些很方便的方法的更多相关文章

  1. Eclipse解决Ctrl+c很卡的方法

    问题如下 : 每当在eclipse中开发java项目打开jsp页面编辑的时候,按了ctrl+c就会卡死几秒的状态,一天经常这样会让人非常的烦躁. 解决方法如下: Eclipse -- Windows- ...

  2. [转]win7下apache2.4响应很慢解决方法

    win7下apache2.4响应很慢解决方法 PS.按照以下方法测试了以下,似乎确实快了一点[skysowe] 转载自: http://blog.sina.com.cn/s/blog_75ad1010 ...

  3. Repeater为空时显示“暂无数据”,很方便实用方法

    Repeater为空时显示“暂无数据”,很方便实用方法 <FooterTemplate>   <asp:Label ID="lblEmptyZP" Text=&q ...

  4. LINQ学习系列-----1.3 扩展方法

    这篇内容继续接着昨天的Lambda表达式的源码继续下去.昨天讲了Lambda表达式,此篇讲扩展方法,这两点都是Linq带来的新特性.    一.扩展方法介绍   废话不多说,先上源码截图: 上图中Ge ...

  5. Linq中string转int的方法

    Linq中string转int的方法   在做批量删除时,需把一串id值所对应的数据删除,调试出现问题: Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误 ...

  6. entity framework 删除数据库出现错误的解决方法--最土但是很有效的方法

    无法删除数据库,因为该数据库当前正在使用. public ChinaerContext() : base("name=ContextConn") { // Database.Set ...

  7. Linq 分页不可缺少的两个方法

    //LINQ分页的方法 //1.获取总页数 public int GetPageCount(int pageSize)//pageSize是每页的行数 { //先查出总共有多少行 int rowCou ...

  8. Linq lamda表达式Single和First方法

      让我们来看看如何对一个整数数组使用 Single 操作符.这个整数数组的每个元素代表 2 的 1 到 10 次方.先创建此数组,然后使用 Single 操作符来检索满足 Linq Lambda表达 ...

  9. [MySQL优化案例]系列 — slave延迟很大优化方法

    备注:插图来自网络搜索,如果觉得不当还请及时告知 :) 一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以In ...

随机推荐

  1. MyBatis入门学习教程-MyBatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了 package me.gacl.test; 2 import me.gacl.domain.User; import ...

  2. bzoj1091: [SCOI2003]切割多边形

    Description 有一个凸p边形(p<=8),我们希望通过切割得到它.一开始的时候,你有一个n*m的矩形,即它的四角的坐标分别为(0,0), (0,m), (n,0), (n,m).每次你 ...

  3. c++中处理输入输出的方法

    ============ 怎么处理一行空格中的逗号, ,,, ,,, ,,, c,c,d,d 使用c++的方法,可以这么处理: #include <sstream> #include< ...

  4. JAVA多态的定义

    对于多态,可以总结它为: 一.使用父类类型的引用指向子类的对象: 二.该引用只能调用父类中定义的方法和变量: 三.如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法: ...

  5. Could not find com.android.tools.build:gradle:1.3.0.

    * What went wrong:          A problem occurred configuring project ':TZYJ_Android'.> Could not re ...

  6. ubuntu下postgreSQL安装配置

    一.安装并配置,并设置远程登陆的用户名和密码 1.安装postgreSQL sudo apt-get update sudo apt-get install postgresql-9.4 在Ubunt ...

  7. 解决Android SDK下载和更新失败的方法(Win系统) 和离线安装

    http://jingyan.baidu.com/article/a3a3f811f370558da2eb8a94.html http://jingyan.baidu.com/article/636f ...

  8. 炉石ZZ操作 [20161224]

    昨天吃完晚饭,开了一盘炉石.选的龙牧,遇到对面马克扎尔战士. 中途,我场上3个较大随从,他突然先拍下一个铜须,菊花一紧,然后果然拍下了大工匠(之前用龙人侦察者看到他牌库有这张牌),逗比的一幕开始了,首 ...

  9. JS toFixed 四舍六入五成双

    以前一直以为toFixed就是四舍五入的方法,后来又有一段时间以为toFixed是五舍六入.今天终于写的时候,终于才知道toFixed是一个叫做四舍六入无成双的诡异的方法... 完全不明白为什么要这么 ...

  10. 带你入门带你飞Ⅰ 使用Mocha + Chai + Sinon单元测试Node.js

    目录 1. 简介 2. 前提条件 3. Mocha入门 4. Mocha实战 被测代码 Example 1 Example 2 Example 3 5. Troubleshooting 6. 参考文档 ...