返回首页

高速

一个集合中比另一个集合多的记录

var addList= newList.Where(p=> !oldList.Any(g=> p.Name==g.Name))

高速

两个集合INNER JOIN

var equalList= newList.Join(oldList,N=> N.Name ,O => O.Name,(N,O)= > new Entity(){ ID=N.ID}).ToList()

高速

两个集合LEFT JOIN

使用GroupJoin方法实现,然后用SelectMany投影,下面的例子中l1是左表,l2是右表
List<Student> l1 = new List<Student>() { new Student(1, "Zhang"), new Student(2, "Li"), new Student(3, "Wang") }; List<Student> l2 = new List<Student>() { new Student(1, "Zhang"), new Student(2, "Li") }; var list= l1.GroupJoin(l2, L => L.ID, R => R.ID, (x, y) => new { L1 = x, R1 = y }).SelectMany(x => x.R1.DefaultIfEmpty(), (x, y) => new { ID = x.L1.ID, Name=x.L1.Name ,Status= (x.R1==null || x.R1.Count()==0)?0:1 }).ToList();

高速

select 投影

treeNodeChildList = childList.Select(o => new TreeNode() { id = o.SrcID, text = o.SrcName, iconCls = "ico-treeline" }).ToList();

高速

两个集合Union

IList customeTabs = allTabs.Where(p => p.IsRef == 1).OrderBy(p => p.OrderNo).ToList(); IList standarTabs = allTabs.Where(p => p.IsRef != 1).OrderBy(p => p.OrderNo).ToList(); IList pages = customeTabs.Union(standarTabs).ToList();

知识点

GroupBy 用法

函数定义:IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(Func<TSource, TKey> keySelector)
解释:传入参数为实体TSource,委托中返回实体中的某一字段TKey。函数返回IEnumerable<IGrouping<TKey,TSource>>,首先是个集合,类似字典的Key/Value,
这里注意IGrouping也是实现了IEnumerable接口的,所以它也是集合。这里的TKey就是前面分组的关键字段,TSource就是实体。当对IGrouping进行迭代时,循环的就是TSource了
代码
class Person { public string Name { set; get; } public int Age { set; get; } public string Gender { set; get; } } 代码调用: List<Person> personList = new List<Person> { new Person { Name = "P1", Age = 18, Gender = "Male" }, new Person { Name = "P2", Age = 19, Gender = "Male", }, new Person { Name = "P2", Age = 17,Gender = "Female", } }; IEnumerable<IGrouping<string,Person>> groups = personList.GroupBy(p => p.Gender); foreach (var group in groups) { Console.WriteLine(group.Key); foreach(var person in group) { Console.WriteLine(string.Format("name:{0},age:{1}",person.Name,person.Age)); } } 输出: Male name:P1,age:18 name:P2,age:19 Female name:P2,age:17
第二种用法:
定义:IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
解释:比上面多了个参数,需要定义自己的自定义类相等比较器
定义比较器
class PersonEqualityComparer : IEqualityComparer<Person> { public bool Equals(Person x, Person y) { return x.Name == y.Name; } public int GetHashCode(Person obj) { return obj.Name.GetHashCode(); } }
可以看到,Name名称相等就算是相等了
代码调用
List<Person> personList = new List<Person> { new Person { Name = "P1", Age = 18, Gender = "Male" }, new Person { Name = "P1", Age = 19, Gender = "Male", }, new Person { Name = "P3", Age = 17,Gender = "Female", } }; var groups = personList.GroupBy(p => p, new PersonEqualityComparer()); foreach (var group in groups) { Console.WriteLine(group.Key.Name.ToString()); foreach (var person in group) { Console.WriteLine(string.Format("\t{0},{1}", person.Age, person.Gender)); } } 结果: P1 18,Male 19,Male P3 17,Female
这里注意GroupBy的第一个参数,相当于Func了,这里没办法传具体的如:p.Name,会提示无法推理出方法的类型参数
更多其他方法重载参考:https://www.cnblogs.com/cncc/p/9846390.html

知识点

Lookup 用法

函数定义:ILookup<TKey, TSource> ToLookup<TSource, TKey>(Func<TSource, TKey> keySelector);
解释:传入参数为实体TSource,委托中返回实体中的某一字段TKey。函数返回ILookup<TKey, TSource>,
里注意ILookup也是实现了IEnumerable接口的,所以它也是集合。这里的TKey就是前面分组的关键字段,TSource就是实体。当对ILookup进行迭代时,循环的就是TSource了
ToLookUp与GroupBy的功能基本一样,但ToLookUp没有GroupBy那样得延迟执行机制,它是立即执行的。e.g:
class Person { public string Name { set; get; } public int Age { set; get; } public string Gender { set; get; } } List<Person> personList = new List<Person> { new Person { Name = "P1", Age = 18, Gender = "Male" }, new Person { Name = "P2", Age = 19, Gender = "Male", }, new Person { Name = "P2", Age = 17,Gender = "Female", } }; ILookup<string,Person> lookups = personList.ToLookup(p => p.Gender); foreach (var lookup in lookups) { Console.WriteLine(string.Format("key:{0} \t", lookup.Key.ToString())); foreach (var person in lookup) { Console.WriteLine(string.Format("{0},{1}\t", person.Name, person.Age)); } Console.WriteLine(); } 输出: key:Male P1,18 P2,19 key:Female P2,17
更多函数重载参考:https://www.cnblogs.com/cncc/p/9853726.html

知识点

SelectMany 用法

从字面上理解就是就是从多个不同的数据集中,把数据取出来集中展示。
介绍其中一种定义:IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
解释:调用SelectMany方法的是一个集合,第一个参数collectionSelector 其实就是另一个集合;第二个委托中参数TSource(代表调用的集合,即调用SelectMany方法的集合),
第二个参数TCollection,其实就是SelectMany的第一个委托的返回参数,然后返回想要的字段。e.g:
class Persons { public string Name { set; get; } public int Age { set; get; } public string Gender { set; get; } public Dog[] Dogs { set; get; } } public class Dog { public string Name { set; get; } } List<Persons> personList = new List<Persons> { new Persons { Name = "P1", Age = 18, Gender = "Male", Dogs = new Dog[] { new Dog { Name = "D1" }, new Dog { Name = "D2" } } }, new Persons { Name = "P2", Age = 19, Gender = "Male", Dogs = new Dog[] { new Dog { Name = "D3" } } }, new Persons { Name = "P3", Age = 17,Gender = "Female", Dogs = new Dog[] { new Dog { Name = "D4" }, new Dog { Name = "D5" }, new Dog { Name = "D6" } } } }; var results = personList.SelectMany(p => p.Dogs, (p, d) => new { PersonName = p.Name, DogName = d.Name }); foreach (var result in results) { Console.WriteLine(string.Format("PersonName:{0},DogName:{1}", result.PersonName, result.DogName)); } 输出: PersonName:P1,DogName:D1 PersonName:P1,DogName:D2 PersonName:P2,DogName:D3 PersonName:P3,DogName:D4 PersonName:P3,DogName:D5 PersonName:P3,DogName:D6
注意 SelectMany第一个参数是Dogs集合,第二个委托中p就是personList,d就是Dogs。
另:SelectMany方法中没有指定对应关系,其实它就是笛卡尔积
其他函数重载请参考:https://www.cnblogs.com/cncc/p/9840463.html

高速

递归两则

public void Factorial() { Func<int, int> fib = null; fib = n => (n == 1) ? 1 : fib(n - 1) * n; Console.WriteLine(fib(5)); } Action, TreeNode> GetVer = null; GetVer = (dataIDSetList,parentTreeNode) => { if (dataIDSetList != null && dataIDSetList.Count > 0) { foreach (var model in dataIDSetList) { List treeNodeChildList; List childList = verList.Where(o => o.SrcPID == model.SrcID).ToList(); TreeNode verModel = new TreeNode { id = model.SrcID, text = model.SrcName, iconCls = "ico-treeline" }; if (model.IDLevel == 1) //一级节点应该添加 { if (childList != null && childList.Count > 0) { treeNodeChildList = childList.Select(o => new TreeNode() { id = o.SrcID, text = o.SrcName, iconCls = "ico-treeline" }).ToList(); listNodes.Add(verModel); } else { verModel.children = null; } } else //非一级节点设置children 属性 { if (parentTreeNode.children == null) { parentTreeNode.children = new List(); } parentTreeNode.children.Add(verModel); if (childList == null || childList.Count == 0) { verModel.children = null; //获取有权限的基线化的数据,拼接到D版本下 List baselineTreeList= baselineList.Where(o => o.ProCode == verModel.id) .Select(o => new TreeNode() { id = o.BlID.ToString(), text = o.Title, iconCls = "ico-treeline" }).ToList(); if (baselineTreeList != null && baselineTreeList.Count > 0) { verModel.children = new List(); verModel.children.AddRange(baselineTreeList); } } } GetVer(childList, verModel); } } };

知识点

Linq中.ToList(), .AsEnumerable(), AsQueryable()的区别和用法

原文链接:https://www.cnblogs.com/joeatgz/p/5180788.html

知识点

判断一个集合中的所有元素在另一个集合中

List<string> listA = new List<string>() { "1", "2", "3" }; List<string> listB = new List<string>() { "1","2", "3","4"}; string str = "false "; if (listA.All(listB.Contains)) { str = "true"; } Console.WriteLine(str);