Skip to content

Instantly share code, notes, and snippets.

@zeusro
Created March 9, 2018 09:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zeusro/6b4d0efa2e2b5a7ff29d3b22c98e6df3 to your computer and use it in GitHub Desktop.
Save zeusro/6b4d0efa2e2b5a7ff29d3b22c98e6df3 to your computer and use it in GitHub Desktop.
DotnetCore-LINQ
using System;
namespace zeusro
{
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
public class Person
{
/// <summary>
/// 身高
/// </summary>
/// <returns></returns>
public int Height { get; set; }
/// <summary>
/// 高度
/// </summary>
/// <returns></returns>
public int Weight { get; set; }
/// <summary>
/// 生日
/// </summary>
/// <returns></returns>
public DateTime Birthday { get; set; }
/// <summary>
/// 爱好
/// </summary>
/// <returns></returns>
public List<string> Hobbies { get; set; }
/// <summary>
/// 身份证号
/// </summary>
/// <returns></returns>
public string Identifier { get; set; }
/// <summary>
/// 地址
/// </summary>
/// <returns></returns>
public string Address { get; set; }
public Sex Sex { get; set; }
}
/// <summary>
/// 性别
/// </summary>
public enum Sex : short
{
//男
Male = 1,
//女
Female,
//第三性 https://zh.wikipedia.org/wiki/%E7%AC%AC%E4%B8%89%E6%80%A7
X,
}
class Program
{
static void Main(string[] args)
{
Person female = new Person()
{
Birthday = new DateTime(1981, 1, 1),
Height = 165,
Weight = 50,
Sex = Sex.Female,
Address = "北京",
Identifier = "1",
Hobbies = new List<string>() { "吃飯", "逛街" },
};
Person male = new Person()
{
Birthday = new DateTime(1982, 2, 1),
Height = 170,
Weight = 50,
Sex = Sex.Male,
Address = "北京",
Identifier = "2",
Hobbies = new List<string>() { "吃飯", "看電影" },
};
Person x = new Person()
{
Birthday = new DateTime(1983, 3, 1),
Height = 170,
Weight = 50,
Sex = Sex.X,
Address = "北京",
Identifier = "3",
Hobbies = new List<string>() { "吃飯", "上網" },
};
Person male2 = new Person()
{
Birthday = new DateTime(1984, 1, 1),
Height = 150,
Weight = 35,
Sex = Sex.Male,
Address = "北京",
Identifier = "4",
Hobbies = new List<string>() { "吃飯", "看電影" },
};
List<Person> list1 = new List<Person>() { female, male, x };
List<Person> list2 = new List<Person>() { female, male2 };
int count1 = list1.Where(o => o.Birthday.Equals(new DateTime(1990, 1, 1)) && o.Sex == Sex.Male).Count();
long count2 = list1.Where(o => o.Birthday.Equals(new DateTime(1990, 1, 1)) && o.Sex == Sex.Male).LongCount();
/*
0
0
*/
var group1 = list1.GroupBy(o => o.Sex);
//当我们使用 GroupBy() 扩展方法时,使用了延迟执行。 这意味着,当你遍历集合的时候,下一个要出现的项目可能会或者可能不会被加载。 这是一个很大的性能改进,但它会引起有趣的副作用。
list1.RemoveAll(o => o.Sex == Sex.X);//定义 groupby 集合后对原集合进行修改,会发现group1里面已经没了 Sex=X的分组
foreach (var groupByItem in group1)
{
Sex sex = groupByItem.Key;
System.Console.WriteLine(sex);
foreach (Person person in groupByItem)
{
System.Console.WriteLine(JsonConvert.SerializeObject(person));
}
}
/*
输出结果:
{"Height":165,"Weight":50,"Birthday":"1981-01-01T00:00:00","Hobbies":["吃飯","逛街"],"Identifier":"1","Address":"北京","Sex":2}
Male
{"Height":170,"Weight":50,"Birthday":"1982-02-01T00:00:00","Hobbies":["吃飯","看電影"],"Identifier":"2","Address":"北京","Sex":1}
Female
{"Height":165,"Weight":50,"Birthday":"1981-01-01T00:00:00","Hobbies":["吃飯","逛街"],"Identifier":"1","Address":"北京","Sex":2}
Male
{"Height":170,"Weight":50,"Birthday":"1982-02-01T00:00:00","Hobbies":["吃飯","看電影"],"Identifier":"2","Address":"北京","Sex":1}
*/
//该 ToLookup() 方法创建一个类似 字典(Dictionary ) 的列表List, 但是它是一个新的 .NET Collection 叫做 lookup。 Lookup,不像Dictionary, 是不可改变的。 这意味着一旦你创建一个lookup, 你不能添加或删除元素。
var group2 = list1.ToLookup(o => o.Sex);
foreach (var groupByItem in group2)
{
Sex sex = groupByItem.Key;
foreach (Person person in groupByItem)
{
System.Console.WriteLine(sex);
System.Console.WriteLine(JsonConvert.SerializeObject(person));
}
}
/*
输出结果:
{"Height":165,"Weight":50,"Birthday":"1981-01-01T00:00:00","Hobbies":["吃飯","逛街"],"Identifier":"1","Address":"北京","Sex":3}
{"Height":170,"Weight":50,"Birthday":"1982-02-01T00:00:00","Hobbies":["吃飯","看電影"],"Identifier":"2","Address":"北京","Sex":3}
*/
var after90 = list1.Where(o => o.Birthday >= new DateTime(1990, 1, 1)).First();//如果结果为空,将会导致异常,所以一般极少使用该方法
//An unhandled exception of type 'System.InvalidOperationException' occurred in System.Linq.dll: 'Sequence contains no elements'
after90 = list1.Where(o => o.Birthday >= new DateTime(1990, 1, 1)).FirstOrDefault();
var after00 = list1.Where(o => o.Birthday >= new DateTime(2000, 1, 1)).FirstOrDefault();
list1.ForEach(item =>
{
//在ForEach當中可對集合進行操作
item.Sex = Sex.X;
});
list1.ForEach(item =>
{
System.Console.WriteLine(JsonConvert.SerializeObject(item));
});
//C#可以对将原集合进行修改
list1 = list1.Where(o => true).ToList();
int maxHeight = list1.Select(o => o.Height).Max();
//同 list1.Max(o => o.Height);
int minWeight = list1.Min(o => o.Weight);
list1.Select(o => o.Identifier).Distinct().ToList();
list1.Skip(1).Take(2);
//升序
list1 = list1.OrderBy(o => o.Birthday).ToList();
//降序
list1 = list1.OrderByDescending(o => o.Birthday).ToList();
//连接,下面表示把 list1和 list2当中相同身份证号的取出来,生成一个新的集合
//实际上, join 有另外的用法,类似 sqlserver 里面的多表连接,将不同数据源结合到一起,生成新的数据结构
var intersect = list1.Join(list2, o => o.Identifier, o => o.Identifier, (a, b) => a).ToList();
//交集 list1 ∩ list2
intersect = list1.Intersect(list2).ToList();
//并集list1 ∪ list2
var union = list1.Union(list2).ToList();
//差集list1 - list2
var except = list1.Except(list2).ToList();
//数据结构转换
list1.ToArray();
//注意如果 key 重复,ToDictionary会导致出错
list1.ToDictionary(o => o.Identifier, o => o);
list1.ToHashSet();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment