Linq的一些很方便的方法

Aggregate

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

常规的做法是:

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

得到的结果是:

1,2,3,4,5

但是如果碰到想要的结果是‘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是求集合之间的差集。直接上代码

 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
10             tmp=strList1.Except(strList2).Aggregate("",(i,c)=>i+" "+c);
11             Console.WriteLine("实例方法调用Except查询strList1不存在strList2中的数据:{0}",tmp);
12
13             tmp = strList2.Except(strList1).Aggregate("", (i, c) => i + " " + c);
14             Console.WriteLine("实例方法调用Except查询strList2不存在strList1中的数据:{0}", tmp);
15
16
17             tmp = Enumerable.Except(strList1, strList2).Aggregate("", (i, c) => i + " " + c);
18             Console.WriteLine("Enumerable静态方法调用Except查询strList2不存在strList1中的数据:{0}", tmp);
19         }

直接结果:

那再来看看这个例子:

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

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 0;

            int hashProductName = product.Key == null ? 0 : 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);

再来看看执行结果:

这样就对了!

未完....

时间: 2025-01-01 00:58:56

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

LINQ:开始使用 LINQ(五)- LINQ 中的查询语法和方法语法

开始使用 LINQ(五)- LINQ 中的查询语法和方法语法 在表示语言集成查询 (LINQ) 使用 LINQ 性查询语法,文档中的多数查询编写.但是,编译代码时,必须将查询语法转换为方法,这就需要 .NET 公共语言运行时 (CLR).这些方法调用标准查询运算符的名称类似 Where.Select.GroupBy.Join.Max和 Average.可以调用这些方法直接使用方法语法而不是查询语法. 查询语法和方法语法语义相同,但是,许多人员发现查询语法更简单.更易于阅读.某些查询必须表示为方法

Linq中string转int的方法

Linq中string转int的方法 在做批量删除时,需把一串id值所对应的数据删除,调试出现问题: Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误: "LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式." 原因是Linq不支持ToString()函数. 可用下述方法进行转换解决: string source = "1,2,3,4

也是很好减肥方法瘦肚子快速减肥方法

也是很好减肥方法瘦肚子 如果不费很大力气便完成,就可以进入到第二阶段:不间断地均速地游10分钟,中间休息3分钟,一共进行3组.游泳时人的新陈代谢速度很快,30分钟就可以消耗1100干焦的热量,而且这样的代谢速度在你离开水的以后还能保持一段时间,所以游泳是非常理想的减肥方法.对于比较瘦弱者,游泳反而能够让体重增加,这是由于游泳对于肌肉的锻炼作用,使肌肉的体积和重量增加的结果,可以说游泳可以把胖人游瘦了,把瘦人游胖了,可以让所有的人都有一个流畅的线条. 欧美女明星的饮食减肥法 说到减肥除了dshwy

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

//LINQ分页的方法 //1.获取总页数 public int GetPageCount(int pageSize)//pageSize是每页的行数 { //先查出总共有多少行 int rowCount = this._Context.car.Count(); //页数=总行数/每页行数 int pageCount =(int) Math.Ceiling(1.0 * rowCount / pageSize); return pageCount; } //2.查询出指定页的数据 public L

slave延迟很大优化方法

一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制线程只有一个sql thread用于binlog的apply,所以难怪slave在高并发时会远落后master. ORACLE MySQL 5.6版本开始支持多线程复制,配置选项 slave_parallel_workers 即可实现在slave上多线程并发复制.不过,它只能支持一个实例下多个 da

一个很笨的方法,写脚本来实现自动调dmp,找有用的数据

很久很久以前用到的方法, 方法挺笨的,但是算是比较实用吧. 全自动的调试dmp,最后只要结果. 谁用得着就给谁看吧. 这里需要两个脚本 1:启动脚本,是一个批处理文件,用来启动调试器,来加载dmp和调试脚本. 2:调试脚本,是一个windbg脚本文件,用来操作调试器,是真正工作的脚本. 现在开始说明脚本内容. 1:启动脚本模板 for /f %%i in ('dir "要获取的dmp文件,可以加通配符* "  /s /b') do (cd /d "调试器路径"cdb

ssh登录很慢解决方法

使用ssh客户端(如:putty)连接Linux服务器,可能会等待10-30秒才有提示输入密码.严重影响工作效率.登录很慢,登录上去后速度正常,这种情况主要有两种可能的原因: 1. DNS反向解析问题 OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法.如果客户机的IP没有域名,或者DNS服务器很慢或不通,那么登录就会很花时间. 解决办法:在目标服务器上修改sshd服务器端配置,并重启sshd vi /et

解决远程连接mysql很慢的方法(mysql_connect 打开连接慢)

在进行 ping和route后发现网络通信都是正常的,而且在mysql机器上进行本地连接发现是很快的,所以网络问题基本上被排除了.以前也遇到过一次这样的问题,可后来就不知怎么突然好了,这次又遭遇这样的问题,所以想看看是不是mysql的配置问题.在查询mysql相关文档和网络搜索后,发现了一个配置似乎可以解决这样的问题,就是在mysql的配置文件中增加如下配置参数: [mysqld] skip-name-resolve 在linux下配置文件是/etc/my.cnf,在windows下配置文件是m

【转】ssh登录很慢解决方法

使用ssh客户端(如:putty)连接Linux服务器,可能会等待10-30秒才有提示输入密码.严重影响工作效率.登录很慢,登录上去后速度正常,这种情况主要有两种可能的原因: 1. DNS反向解析问题 OpenSSH在用户登录的时候会验证IP,它根据用户的IP使用反向DNS找到主机名,再使用DNS找到IP地址,最后匹配一下登录的IP是否合法.如果客户机的IP没有域名,或者DNS服务器很慢或不通,那么登录就会很花时间. 解决办法:在目标服务器上修改sshd服务器端配置,并重启sshd vi /et