准备的示例数据
using System.Data;
using System.Linq;
using System.Security.Cryptography;
using System.Xml.Linq;
List<Student> students = new List<Student>
{
new Student
{
Id = 1,
Name = "赵雷",
Age = 21,
BrithDate = DateTime.Parse("1990-01-01"),
Sex = Sex.男
},
new Student
{
Id = 2,
Name = "钱电",
Age = 25,
BrithDate = DateTime.Parse("1990-12-21"),
Sex = Sex.男
},
new Student
{
Id = 3,
Name = "孙风",
Age = 23,
BrithDate = DateTime.Parse("1990-05-20"),
Sex = Sex.男
},
new Student
{
Id = 4,
Name = "李云",
Age = 22,
BrithDate = DateTime.Parse("1990-08-06"),
Sex = Sex.男
},
new Student
{
Id = 5,
Name = "周梅",
Age = 23,
BrithDate = DateTime.Parse("1991-12-01"),
Sex = Sex.女
},
new Student
{
Id = 6,
Name = "吴兰",
Age = 24,
BrithDate = DateTime.Parse("1992-03-01"),
Sex = Sex.女
},
new Student
{
Id = 7,
Name = "郑竹",
Age = 25,
BrithDate = DateTime.Parse("1989-07-01"),
Sex = Sex.女
},
new Student
{
Id = 8,
Name = "王菊",
Age = 24,
BrithDate = DateTime.Parse("1990-01-20"),
Sex = Sex.女
},
};
List<Student> students1 = new List<Student>();
List<Teacher> teachers = new List<Teacher>
{
new Teacher
{
Id = 1,
Name = "周明",
Age = 34,
BrithDate = DateTime.Parse("1990-01-20"),
Sex = Sex.男
},
new Teacher
{
Id = 2,
Name = "李康",
Age = 48,
BrithDate = DateTime.Parse("1990-01-20"),
Sex = Sex.男
},
new Teacher
{
Id = 3,
Name = "李华",
Age = 28,
BrithDate = DateTime.Parse("1990-01-20"),
Sex = Sex.女
},
new Teacher
{
Id = 4,
Name = "唐三",
Age = 53,
BrithDate = DateTime.Parse("1990-01-20"),
Sex = Sex.男
},
new Teacher
{
Id = 5,
Name = "洋葱",
Age = 78,
BrithDate = DateTime.Parse("1990-01-20"),
Sex = Sex.女
}
};
List<Person> personList = new List<Person>
{
new Person
{
Name = "P1",
Age = 18,
Gender = "Male",
Dogs = new Dog[]
{
new Dog { Name = "D1" },
new Dog { Name = "D2" }
}
},
new Person
{
Name = "P2",
Age = 19,
Gender = "Male",
Dogs = new Dog[]
{
new Dog { Name = "D3" }
}
},
new Person
{
Name = "P3",
Age = 17,
Gender = "Female",
Dogs = new Dog[]
{
new Dog { Name = "D4" },
new Dog { Name = "D5" },
new Dog { Name = "D6" }
}
}
};
var list1 = from item in students
select item.Name;
foreach (var item in list1)
{
Console.WriteLine(item); // 赵雷 钱电 孙风 李云 周梅 吴兰 郑竹 王菊
}
计数
var list2 = students.Count();
Console.WriteLine(list2); // 8
升序
var list3 = students.OrderBy(x => x.Id).ToList();
foreach (var item in list3)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
}
降序
var list4 = students.OrderByDescending(x => x.Id).ToList();
foreach (var item in list4)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
}
次要升序
var list5 = students.OrderBy(x => x.Age).ThenBy(x => x.Id).ToList();
foreach (var item in list5)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
}
次要降序
var list6 = students.OrderByDescending(x => x.Age).ThenByDescending(x => x.Id).ToList();
foreach (var item in list6)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
}
颠倒顺序(反转)
list6.Reverse();
foreach (var item in list6)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
}
去重 (todo: 针对对象如何去重)
var list8 = students.Select(x => x.Age).Distinct().ToList();
foreach (var item in list8)
{
Console.WriteLine(item); // 21 25 23 22 24
}
差集
List<int> list9 = new List<int> { 1, 2, 3, 4 };
List<int> list10 = new List<int> { 3, 4, 5, 6 };
List<int> chajiList = list9.Except(list10).ToList();
foreach (var item in chajiList)
{
Console.WriteLine(item); // 1 2
}
交集
var list11 = list9.Intersect(list10);
foreach (var item in list11)
{
Console.WriteLine(item); // 3 4
}
并集
var list12 = list9.Union(list10);
foreach (var item in list12)
{
Console.WriteLine(item); // 1 2 3 4 5 6
}
筛选
var list13 = students.Where(x => x.Age >= 24).ToList();
foreach (var item in list13)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
}
所有元素是否满足条件
var isMan = students.All(x => x.Sex == Sex.男);
Console.WriteLine(isMan); // false
var isChengNian = students.All(x => x.Age >= 18);
Console.WriteLine(isChengNian); // true
部分元素是否满足条件
var hasWoman = students.Any(x => x.Sex == Sex.女);
Console.WriteLine(hasWoman); // true
var hasStudent = students1.Any();
Console.WriteLine(hasStudent); // false
是否包含元素
var isContains = list9.Contains(4);
Console.WriteLine(isContains); // true
映射
var list14 = students.Select(x => new { sid = x.Id, sname = x.Name }).ToList();
foreach (var item in list14)
{
Console.WriteLine($"sid={item.sid}, sname={item.sname}");
//sid = 1, sname = 赵雷
//sid = 2, sname = 钱电
//sid = 3, sname = 孙风
//sid = 4, sname = 李云
//sid = 5, sname = 周梅
//sid = 6, sname = 吴兰
//sid = 7, sname = 郑竹
//sid = 8, sname = 王菊
}
映射
var dogs = personList.SelectMany(p => p.Dogs);
foreach (var dog in dogs)
{
Console.WriteLine(dog.Name); // D1 D2 D3 D4 D5 D6
}
跳过
var list15 = students.Skip(1).ToList();
foreach (var item in list15)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
}
跳过(根据条件)
var list16 = students.SkipWhile(x => x.Sex == Sex.男).ToList();
foreach (var item in list16)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 5 name = 周梅 age = 23 brithDate = 1991 - 12 - 01 sex = 女
//id = 6 name = 吴兰 age = 24 brithDate = 1992 - 03 - 01 sex = 女
//id = 7 name = 郑竹 age = 25 brithDate = 1989 - 07 - 01 sex = 女
//id = 8 name = 王菊 age = 24 brithDate = 1990 - 01 - 20 sex = 女
}
提取
var list17 = students.Take(3).ToList();
foreach (var item in list17)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
}
提取 (根据条件)
var list18 = students.TakeWhile(x => x.Sex == Sex.男).ToList();
foreach (var item in list18)
{
Console.WriteLine($"id={item.Id} name={item.Name} age={item.Age} " +
$"brithDate={item.BrithDate.ToString("yyyy-MM-dd")} sex={item.Sex}");
//id = 1 name = 赵雷 age = 21 brithDate = 1990 - 01 - 01 sex = 男
//id = 2 name = 钱电 age = 25 brithDate = 1990 - 12 - 21 sex = 男
//id = 3 name = 孙风 age = 23 brithDate = 1990 - 05 - 20 sex = 男
//id = 4 name = 李云 age = 22 brithDate = 1990 - 08 - 06 sex = 男
}
联接 (内连接)
/*宠物主人*/
Personal magnus = new Personal { Name = "Hedlund, Magnus" };
Personal terry = new Personal { Name = "Adams, Terry" };
Personal charlotte = new Personal { Name = "Weiss, Charlotte" };
/*宠物*/
Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };
/*宠物主人列表集合*/
List<Personal> people = new List<Personal> { magnus, terry, charlotte };
/*宠物列表集合*/
List<Pet> pets = new List<Pet> { barley, boots, whiskers, daisy };
var query = people.Join(pets, person => person, pet => pet.Owner
, (person, pet) => new { OwnerName = person.Name, Pet = pet.Name });
var query2 = pets.Join(people, pet => pet.Owner, person => person
, (pet, person) => new { OwnerName = person.Name, Pet = pet.Name });
/循环输出最终结果 格式:宠物主人名-宠物名/
foreach (var obj in query2)
{
Console.WriteLine("{0} - {1}", obj.OwnerName, obj.Pet);
}
// 分组
var list19 = students.GroupBy(g => g.Sex);
foreach (var item in list19)
{
Console.WriteLine(item.Key);
foreach (var i in item)
{
Console.WriteLine($"id={i.Id} name={i.Name} age={i.Age} " +
$"brithDate={i.BrithDate.ToString("yyyy-MM-dd")} sex={i.Sex}");
}
}
var list20 = students.GroupBy(g => g.Sex).Select(x => x.Select(y => new { id = y.Id, name = y.Name, sex = y.Sex, sex1 = x.Key })).ToList();
foreach (var item in list20)
{
foreach (var i in item)
{
Console.WriteLine($"id={i.id} name={i.name} " +
$"sex={i.sex} sex1={i.sex1}");
}
}
联接并分组 GrooupJoin
变一对多字典 ToLookup
平均值
var average = students.Average(g => g.Age);
Console.WriteLine(average); // 23.375
计数
var count = students.Count(x => x.Sex == Sex.男);
Console.WriteLine(count); // 4
计数(大型集合)LongCount
最大值
var max = students.Max(g => g.Age);
Console.WriteLine(max); // 25
最小值
var min = students.Min(g => g.Age);
Console.WriteLine(min); // 21
求和
var sum = students.Sum(s => s.Id);
Console.WriteLine(sum); // 36
串联 Concat 合并列表
var concat = list9.Concat(list10);
foreach (var item in concat)
{
Console.WriteLine(item);
//1
//2
//3
//4
//3
//4
//5
//6
}
变IEeumerable
var list21 = students.AsEnumerable();
变IQueryable
var list22 = students.AsQueryable();
// DataTable dt = …//获取从数据库中取出的数据(假设只有一条记录)
// 转换 Cast
//Cast()用来将非泛型的序列转换为泛型的序列
DataRow row = dt.Rows.Cast<DataRow>().Single();
转换 OfType
// OfType():用来将序列中可以转换的转换为指定的序列
// 如:一个object数组中有整数和字符串,现在想找出其中最大的数
object[] obj = { 1, 23, 4, 5, 555, "aaa", "bbb" };
int max1 = obj.OfType<int>().Max();
这样就不会抛出异常
变数组 ToArray
var list23 = students.ToArray();
变字典 ToDictionary
var results = new Dictionary<int, Product>();
foreach (var product in products)
{
results.Add(product.Id, product);
}
var list24 = students.ToDictionary(x => x.Id, y => y.Name);
foreach (var item in list24)
{
Console.WriteLine($"id = {item.Key}, name = {item.Value}");
//id = 1, name = 赵雷
//id = 2, name = 钱电
//id = 3, name = 孙风
//id = 4, name = 李云
//id = 5, name = 周梅
//id = 6, name = 吴兰
//id = 7, name = 郑竹
//id = 8, name = 王菊
}
变List
var list25 = students.ToList();
指定索引 ElementAt
指定索引(超出索引, 默认取值) ElementAtOrDefault
第一个
var list26 = students.First();
var list27 = students.First(x => x.Age == 23);
Console.WriteLine(list27.Name); // 孙风
第一个(找不到取默认值)
var list28 = students1.FirstOrDefault();
if (list28 == null)
{
Console.WriteLine("list28为null"); // list28为null
}
最后一个
var list29 = students.Last(x => x.Age == 23);
Console.WriteLine(list29.Name); // 周梅
最后一个(找不到取默认值)
var list30 = students1.LastOrDefault();
if (list30 == null)
{
Console.WriteLine("list30为null"); // list30为null
}
唯一
var list31 = students.Single(x => x.Id == 5);
Console.WriteLine(list31.Name); // 周梅
唯一 (找不到取默认值)
var list32 = students.SingleOrDefault(x => x.Id == 15);
if (list32 == null)
{
Console.WriteLine("list32为null"); // list32为null
}
成对比较 SequenceEqual
默认值集合 DefaultifEmpty
空集合 Empty
包含数字序列的集合 Range
IEnumerable<int> squares = Enumerable.Range(1, 10).Select(x => x * x);
foreach (int num in squares)
{
Console.WriteLine(num);
//1
//4
//9
//16
//25
//36
//49
//64
//81
//100
}
重复值的集合 Repeat 10是要重复的值, 5是重复的次数
var val = Enumerable.Repeat(10, 5);
foreach (int res in val)
{
Console.WriteLine(res);
//10
//10
//10
//10
//10
}
测试数据类
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime BrithDate { get; set; }
public Sex Sex { get; set; }
}
public class Teacher
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public DateTime BrithDate { get; set; }
public Sex Sex { get; set; }
}
public enum Sex
{
男,
女
}
class Person
{
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; }
}
/*宠物主人*/
class Personal
{
public string Name { get; set; }
}
/*宠物*/
class Pet
{
public string Name { get; set; }
public Personal Owner { get; set; }
}