返回首页
高速
一个集合中比另一个集合多的记录
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);