返回首页
 
高速
一个集合中比另一个集合多的记录
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 l1 = new List() { new Student(1, "Zhang"), new Student(2, "Li"), new Student(3, "Wang") };
List l2 = new List() { 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> GroupBy(Func keySelector)
解释:传入参数为实体TSource,委托中返回实体中的某一字段TKey。函数返回
IEnumerable>,首先是个集合,类似字典的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 personList = new List
        {
            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> 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> GroupBy(Func keySelector, IEqualityComparer comparer);
解释:比上面多了个参数,需要定义自己的自定义类相等比较器
定义比较器
class PersonEqualityComparer : IEqualityComparer
        {
            public bool Equals(Person x, Person y)
            {
                return x.Name == y.Name;
            }
            public int GetHashCode(Person obj)
            {
                return obj.Name.GetHashCode();
            }
        }
可以看到,Name名称相等就算是相等了
代码调用
List personList = new List
        {
            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 ToLookup(Func keySelector);
解释:传入参数为实体TSource,委托中返回实体中的某一字段TKey。函数返回
ILookup,
里注意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 personList = new List
        {
            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 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 SelectMany(Func> collectionSelector, Func 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 personList = new List
            {
                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 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 listA = new List() { "1", "2", "3" };
List listB = new List() { "1","2", "3","4"};
string str = "false   ";
if (listA.All(listB.Contains))
{
	str = "true";
}
Console.WriteLine(str);