C# Linq常用方法
文章目录
- 前言
- 基本查询方法
- Where:用于过滤集合中的元素
- Select:用于将集合中的每个元素投影(转换)为新形式
- SelectMany:用于将多个集合“展平”为一个集合
- OrderBy:用于对集合进行升序排序
- OrderByDescending:用于对集合进行降序排序
- ThenBy:用于在已排序的集合上应用次要排序
- ThenByDescending:用于在已排序的集合上应用次要降序排序
- 聚合方法
- Count:返回集合中的元素数量
- Sum:返回集合中数值类型元素的和
- Average:返回集合中数值类型元素的平均值
- Min:返回集合中的最小值
- Max:返回集合中的最大值
- Aggregate:对集合进行自定义聚合操作
- 集合操作
- Distinct:返回集合中的唯一元素
- Union:返回两个集合的并集
- Intersect:返回两个集合的交集
- Except:返回在第一个集合中存在但不在第二个集合中存在的元素
- Concat:连接两个或多个集合,并返回一个新的序列
- 分组与连接
- GroupBy:根据键对集合进行多级分组
- Join:根据匹配键连接两个集合
- 元素操作
- First:返回集合中的第一个元素
- FirstOrDefault:返回集合中的第一个元素,如果集合为空则返回默认值
- Single:返回集合中的单个元素,如果集合为空或包含多个元素则抛出异常
- SingleOrDefault:返回集合中的单个元素,如果集合为空或包含多个元素则返回默认值
- Last:返回集合中的最后一个元素
- LastOrDefault:返回集合中的最后一个元素,如果集合为空则返回默认值
- ElementAt:返回集合中指定索引处的元素
- ElementAtOrDefault:返回集合中指定索引处的元素,如果索引超出范围则返回默认值
- DefaultIfEmpty:如果集合为空,则返回一个包含默认值的集合
- 跳过与获取指定数量的元素
- Skip:用于跳过集合中指定数量的元素,并返回剩余的元素序列
- Take:用于从集合的开头获取指定数量的元素,并返回一个新的序列
- 条件判断
- All:用于判断集合中的所有元素是否都满足指定条件
- Any:检查集合是否包含任何元素
- Any:用于判断集合中是否存在至少一个满足指定条件的元素
- Contains:用于判断集合中是否包含指定的元素
- 其他高级方法
- Reverse:用于反转集合中的元素顺序
- SequenceEqual:用于比较两个集合是否相等(即它们是否包含相同数量和顺序的元素)
- Zip:将两个集合的元素按照指定的函数进行配对,并返回一个新的序列
- AsEnumerable:将集合转换为 IEnumerable<T> 类型,以便进行LINQ查询。这通常用于在已进行某些操作(如排序或过滤)的集合上执行额外的LINQ操作
- Cast<TResult>():将集合中的元素转换为指定的类型
- OfType<TResult>():过滤出集合中指定类型的元素
- Lambda表达式与扩展方法
- 总结
前言
以下所有Linq方法都采用此模板
using System;
using System.Linq;
using System.Collections.Generic;
namespace ConsoleApp1
{
public class Program
{
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
List<Person> list = new List<Person>
{
new Person() { Id = 18, Name = "罗丽" },
new Person() { Id = 19, Name = "李明" },
};
var result = list.FirstOrDefault(item => item.Id == 18);
Console.WriteLine(result.Id + " : " + result.Name);//18 : 罗丽
Console.ReadLine();
}
}
}
基本查询方法
Where:用于过滤集合中的元素
var filteredList = list.Where(item => item.Id == 18);
Select:用于将集合中的每个元素投影(转换)为新形式
var newList = list.Select(item => new { NewProperty = item.Name });
foreach (var item in newList) {
Console.WriteLine(item.NewProperty);//罗丽 李明
}
SelectMany:用于将多个集合“展平”为一个集合
var flatList = listOfLists.SelectMany(subList => subList);
OrderBy:用于对集合进行升序排序
var sortedList = list.OrderBy(item => item.Id);
OrderByDescending:用于对集合进行降序排序
var sortedListDesc = list.OrderByDescending(item => item.Id);
ThenBy:用于在已排序的集合上应用次要排序
var sortedList = list.OrderBy(item => item.PrimaryProperty).ThenBy(item => item.SecondaryProperty);
ThenByDescending:用于在已排序的集合上应用次要降序排序
var sortedList = list.OrderBy(item => item.PrimaryProperty).ThenByDescending(item => item.SecondaryProperty);
聚合方法
Count:返回集合中的元素数量
var count = list.Count();
Sum:返回集合中数值类型元素的和
var sum = list.Sum(item => item.NumericProperty);
Average:返回集合中数值类型元素的平均值
var average = list.Average(item => item.NumericProperty);
Min:返回集合中的最小值
var min = list.Min(item => item.NumericProperty);
Max:返回集合中的最大值
var max = list.Max(item => item.NumericProperty);
Aggregate:对集合进行自定义聚合操作
var aggregateResult = list.Aggregate((seed, item) => seed + item.NumericProperty);
集合操作
Distinct:返回集合中的唯一元素
var uniqueList = list.Distinct();
Union:返回两个集合的并集
var unionList = list1.Union(list2);
Intersect:返回两个集合的交集
var intersectList = list1.Intersect(list2);
Except:返回在第一个集合中存在但不在第二个集合中存在的元素
var exceptList = list1.Except(list2);
Concat:连接两个或多个集合,并返回一个新的序列
var concatList = list1.Concat(list2);
分组与连接
GroupBy:根据键对集合进行多级分组
var groupedList = list.GroupBy(item => item.KeyProperty);
var multiLevelGroupedList = list.GroupBy(item => item.Key1)
.Select(g => new { Key1 = g.Key, SubGroups = g.GroupBy(subItem => subItem.Key2) });
Join:根据匹配键连接两个集合
var joinedList = list1.Join(list2, item1 => item1.Key, item2 => item2.Key, (item1, item2) => new { item1, item2 });
元素操作
First:返回集合中的第一个元素
var firstElement = list.First();
FirstOrDefault:返回集合中的第一个元素,如果集合为空则返回默认值
var firstOrDefault = list.FirstOrDefault();
Single:返回集合中的单个元素,如果集合为空或包含多个元素则抛出异常
var singleElement = list.Single();
SingleOrDefault:返回集合中的单个元素,如果集合为空或包含多个元素则返回默认值
var singleOrDefault = list.SingleOrDefault();
Last:返回集合中的最后一个元素
var lastElement = list.Last();
LastOrDefault:返回集合中的最后一个元素,如果集合为空则返回默认值
var lastOrDefault = list.LastOrDefault();
ElementAt:返回集合中指定索引处的元素
var elementAt = list.ElementAt(index);
ElementAtOrDefault:返回集合中指定索引处的元素,如果索引超出范围则返回默认值
var elementAtOrDefault = list.ElementAtOrDefault(index);
DefaultIfEmpty:如果集合为空,则返回一个包含默认值的集合
var defaultIfEmpty = list.DefaultIfEmpty();
跳过与获取指定数量的元素
Skip:用于跳过集合中指定数量的元素,并返回剩余的元素序列
var skippedList = list.Skip(numberToSkip);
Take:用于从集合的开头获取指定数量的元素,并返回一个新的序列
var takenList = list.Take(numberToTake);
条件判断
All:用于判断集合中的所有元素是否都满足指定条件
var allSatisfy = list.All(item => item.Condition);
Any:检查集合是否包含任何元素
var hasElements = list.Any();
Any:用于判断集合中是否存在至少一个满足指定条件的元素
var anySatisfy = list.Any(item => item.Condition);
Contains:用于判断集合中是否包含指定的元素
var containsElement = list.Contains(elementToCheck);
其他高级方法
Reverse:用于反转集合中的元素顺序
var reversedList = list.Reverse();
SequenceEqual:用于比较两个集合是否相等(即它们是否包含相同数量和顺序的元素)
var areEqual = list1.SequenceEqual(list2);
Zip:将两个集合的元素按照指定的函数进行配对,并返回一个新的序列
var zippedList = list1.Zip(list2, (item1, item2) => new { item1, item2 });
AsEnumerable:将集合转换为 IEnumerable 类型,以便进行LINQ查询。这通常用于在已进行某些操作(如排序或过滤)的集合上执行额外的LINQ操作
var enumerableList = list.AsEnumerable();
Cast():将集合中的元素转换为指定的类型
var castList = list.Cast<TResult>();
OfType():过滤出集合中指定类型的元素
var ofTypeList = list.OfType<TResult>();
Lambda表达式与扩展方法
LINQ查询通常使用Lambda表达式来定义查询条件和操作。Lambda表达式提供了一种简洁的方式来表示匿名方法。
LINQ扩展方法是定义在 System.Linq 命名空间中的静态方法,它们可以对实现了 IEnumerable<T> 接口的集合进行操作。通过调用这些扩展方法,你可以对集合执行各种查询和操作。
总结
需要注意的是,LINQ查询的性能取决于多种因素,包括数据源的类型、查询的复杂性以及底层数据的存储方式等。因此,在使用LINQ时,应关注查询的性能,并尽量优化查询逻辑以减少不必要的计算和资源消耗。 以上是对LINQ中一些其他常用方法的介绍。通过学习和掌握这些方法,你可以更灵活地处理各种数据集合,提高编程效率和代码可读性。