首页 > 代码库 > Linq的一些很方便的方法
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);
再来看看执行结果:
这样就对了!
未完....
Linq的一些很方便的方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。