Skip to main content

2 LINQ

LINQ是扩展方法(需要引入using System.Linq)

var nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

// LINQ Where扩展方法
var res = nums.Where(p => p > 4).ToList();
foreach (var item in res)
{
    Console.Write(item + ", ");
}

Console.WriteLine();

// 使用自己写的方法
var res2 = MyWhere(nums, p => p > 5);
foreach (var item in res2)
{
    Console.Write(item + ", ");
}

IEnumerable<int> MyWhere(IEnumerable<int> numbers, Func<int, bool> predicate)
{
    foreach (var num in numbers)
    {
        if (predicate(num))
        {
            // 配合 yield return 提高代码效率
            yield return num;
        }
    }
}

常用扩展方法


class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public bool Gender { get; set; }
    public int Salary { get; set; }

    public override string ToString()
    {
        return $"Id: {Id}, Name: {Name}, Age: {Age}, Gender: {Gender}, Salary: {Salary}";
    }
}


var list = new List<Employee>
{
    new() { Id = 1, Name = "jerry", Age = 28, Gender = true, Salary = 5000 },
    new() { Id = 2, Name = "jim", Age = 33, Gender = true, Salary = 3000 },
    new() { Id = 3, Name = "lily", Age = 35, Gender = false, Salary = 9000 },
    new() { Id = 4, Name = "lucy", Age = 16, Gender = false, Salary = 2000 },
    new() { Id = 5, Name = "kimi", Age = 25, Gender = true, Salary = 1000 },
    new() { Id = 6, Name = "nancy", Age = 35, Gender = false, Salary = 8000 },
    new() { Id = 7, Name = "zack", Age = 35, Gender = true, Salary = 8500 },
    new() { Id = 8, Name = "jack", Age = 33, Gender = true, Salary = 8000 }
};

// Where 筛选
list.Where(e => e.Age > 30).ToList().ForEach(Console.WriteLine);
// Count 获取数量
Console.WriteLine("Count: " + list.Count(e => e.Age > 30));
// Any
Console.WriteLine("Any: " + list.Any(e => e.Salary > 5000));
// Single/SingleOrDefault
// First/FirstOrDefault
Console.WriteLine("Single: " + list.Single(p => p.Id == 1));
// OrderBy/OrderByDescending
_ = list.OrderBy(p => p.Age);
// 取部分数据, Skip(), Take()
_ = list.Skip(5).Take(2);
// 聚合函数, Sum, Min, Max, Count, Average
_ = list.Where(p => p.Age > 30).Average(p => p.Salary);
// 分组 GroupBy
var groups = list.GroupBy(p => p.Age);
foreach (var group in groups)
{
    Console.WriteLine(group.Key);
    foreach (var item in group)
    {
        Console.WriteLine(item);
    }

    Console.WriteLine("----------");
}

// 投影 Select
var items = list.Select(p => p.Age);

// 匿名类型
var An = new
{
    Id = 1,
    Name = "jerry",
};
Console.WriteLine(An.Id);

// 链式调用
_ = list.Where(p => p.Id > 2).GroupBy(p => p.Age).OrderBy(p => p.Key).Take(3).Select(p => new
{
    Age = p.Key,
    Count = p.Count(),
    AvgSalary = p.Average(q => q.Salary)
});