C#开发-集合使用和技巧(三)
集合扩展方法介绍
Enumerable 类扩展方法介绍
这些方法允许我们以声明式的方式处理集合数据。下面是 Enumerable
类中的一些常见方法及其用途:
方法 | 描述 | 类别 |
---|---|---|
All |
测试序列中的所有元素是否满足指定的条件。 | 查询方法 |
Any |
检查序列是否包含任何元素,或者满足指定条件的元素。 | 查询方法 |
Average |
计算序列中所有元素的平均值。 | 数值聚合 |
Concat |
连接两个序列。 | 操作方法 |
Contains |
检查序列中是否包含某个元素。 | 查询方法 |
Count |
返回序列中元素的数量。 | 查询方法 |
Distinct |
返回序列中不同的元素。 | 操作方法 |
ElementAt |
返回序列中指定位置的元素。 | 查询方法 |
Except |
返回第一个序列中不在第二个序列中的元素。 | 操作方法 |
First |
返回序列的第一个元素。 | 查询方法 |
FirstOrDefault |
返回序列的第一个元素,如果没有则返回默认值。 | 查询方法 |
GroupBy |
将序列分割成多个组。 | 分组方法 |
GroupJoin |
对两个序列进行连接,并按组返回结果。 | 分组方法 |
Intersect |
返回两个序列中共有的元素。 | 操作方法 |
Join |
将两个序列根据共同的属性连接起来。 | 操作方法 |
Last |
返回序列的最后一个元素。 | 查询方法 |
LastOrDefault |
返回序列的最后一个元素,如果没有则返回默认值。 | 查询方法 |
Max |
返回序列中的最大值。 | 数值聚合 |
Min |
返回序列中的最小值。 | 数值聚合 |
OfType |
过滤序列中指定类型的元素。 | 查询方法 |
Reverse |
反转序列中的元素。 | 操作方法 |
Select |
将序列中的元素映射到新的形式。 | 转换方法 |
SelectMany |
将序列中的元素映射到新的序列,并将它们合并成一个序列。 | 转换方法 |
SequenceEqual |
比较两个序列是否相等。 | 查询方法 |
Single |
返回序列中唯一的元素。 | 查询方法 |
SingleOrDefault |
返回序列中唯一的元素,如果没有则返回默认值。 | |
Skip |
跳过序列中的前N个元素。 | 操作方法 |
Sum |
计算序列中所有元素的总和。 | 数值聚合 |
Take |
获取序列中的前N个元素。 | 操作方法 |
ToArray |
将序列转换成数组。 | 转换方法 |
ToList |
将序列转换成列表。 | 转换方法 |
ToLookup |
将序列转换成查找字典。 | 转换方法 |
Where |
根据条件筛选序列中的元素。 | 查询方法 |
扩展方法分类介绍
接下来,挑选一些常用的方法进行分类和介绍:
查询方法
Where
定义
csharp
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);
**功能**:过滤序列中的元素。
示例:
csharp
var filtered = numbers.Where(n => n > 0); // 大于0的元素
All
定义
csharp
public static bool All<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
功能 :检查序列中的所有元素是否满足指定条件。
示例:检查一个数字序列是否全部大于零。
csharp
bool allPositive = numbers.All(num => num > 0);
Any
定义
csharp
public static bool Any<TSource>(this IEnumerable<TSource> source);
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
功能 :检查序列中是否有任何一个元素满足指定条件。
示例:检查一个序列是否包含任何负数。
csharp
bool hasNegative = numbers.Any(num => num < 0);
Contains
定义:
csharp
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource>? comparer);
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value);
用途:检查序列中是否包含某个特定的元素。
示例:检查序列中是否包含某个数字。
csharp
bool containsFive = numbers.Contains(5);
Count
定义
csharp
public static int Count<TSource>(this IEnumerable<TSource> source);
public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
功能 :返回序列中元素的数量。
示例:获取序列中的元素总数。
csharp
int count = numbers.Count();
First
定义
csharp
public static TSource First<TSource>(this IEnumerable<TSource> source);
public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
功能 :返回序列的第一个元素。
示例:获取序列中的第一个数字。
csharp
int firstNumber = numbers.First();
数值聚合
Average
定义
csharp
public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);
public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);
public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);
public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector);
public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector);
public static double? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector);
public static float Average<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector);
public static double? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector);
public static float? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector);
public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector);
public static double? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector);
public static decimal Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector);
public static decimal? Average<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector);
public static float? Average(this IEnumerable<float?> source);
public static double? Average(this IEnumerable<long?> source);
public static double? Average(this IEnumerable<int?> source);
public static double? Average(this IEnumerable<double?> source);
public static decimal? Average(this IEnumerable<decimal?> source);
public static double Average(this IEnumerable<long> source);
public static double Average(this IEnumerable<int> source);
public static double Average(this IEnumerable<double> source);
public static decimal Average(this IEnumerable<decimal> source);
public static float Average(this IEnumerable<float> source);
功能 :计算序列中所有元素的平均值。
示例:计算一组数字的平均值。
csharp
double average = numbers.Average();
- Max
定义
csharp
public static long Max<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector);
public static decimal Max<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector);
public static double Max<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector);
public static int Max<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector);
public static decimal? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector);
public static TSource? Max<TSource>(this IEnumerable<TSource> source, IComparer<TSource>? comparer);
public static int? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector);
public static long? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector);
public static float? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector);
public static TResult? Max<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
public static double? Max<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector);
public static TSource? Max<TSource>(this IEnumerable<TSource> source);
public static float Max<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector);
public static float Max(this IEnumerable<float> source);
public static float? Max(this IEnumerable<float?> source);
public static long? Max(this IEnumerable<long?> source);
public static int? Max(this IEnumerable<int?> source);
public static double? Max(this IEnumerable<double?> source);
public static decimal? Max(this IEnumerable<decimal?> source);
public static long Max(this IEnumerable<long> source);
public static int Max(this IEnumerable<int> source);
public static double Max(this IEnumerable<double> source);
public static decimal Max(this IEnumerable<decimal> source);
功能 :获取序列中的最大值。
示例:
csharp
int max = numbers.Max(); // 获取最大值
- Min
定义
csharp
public static decimal Min(this IEnumerable<decimal> source);
public static TResult? Min<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
public static float Min<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector);
public static float? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector);
public static int? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector);
public static double? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector);
public static decimal? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector);
public static long Min<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector);
public static int Min<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector);
public static decimal Min<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector);
public static TSource? Min<TSource>(this IEnumerable<TSource> source, IComparer<TSource>? comparer);
public static TSource? Min<TSource>(this IEnumerable<TSource> source);
public static long? Min<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector);
public static double Min<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector);
public static float Min(this IEnumerable<float> source);
public static float? Min(this IEnumerable<float?> source);
public static long? Min(this IEnumerable<long?> source);
public static int? Min(this IEnumerable<int?> source);
public static double? Min(this IEnumerable<double?> source);
public static decimal? Min(this IEnumerable<decimal?> source);
public static double Min(this IEnumerable<double> source);
public static long Min(this IEnumerable<long> source);
public static int Min(this IEnumerable<int> source);
功能 :获取序列中的最小值。
示例:
csharp
int min = numbers.Min(); // 获取最小值
- Sum
定义
csharp
public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector);
public static long Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, long> selector);
public static decimal? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal?> selector);
public static long? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, long?> selector);
public static int? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int?> selector);
public static double Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, double> selector);
public static float? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, float?> selector);
public static float Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, float> selector);
public static double? Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, double?> selector);
public static decimal Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector);
public static long? Sum(this IEnumerable<long?> source);
public static float? Sum(this IEnumerable<float?> source);
public static int? Sum(this IEnumerable<int?> source);
public static double? Sum(this IEnumerable<double?> source);
public static decimal? Sum(this IEnumerable<decimal?> source);
public static long Sum(this IEnumerable<long> source);
public static int Sum(this IEnumerable<int> source);
public static double Sum(this IEnumerable<double> source);
public static decimal Sum(this IEnumerable<decimal> source);
public static float Sum(this IEnumerable<float> source);
功能 :计算序列中所有元素的总和。
示例:
csharp
int total = numbers.Sum(); // 计算总和
操作方法
Distinct
定义
csharp
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource>? comparer);
功能 :返回序列中不同的元素。
示例:去除重复的数字。
csharp
IEnumerable<int> unique = numbers.Distinct();
- Reverse
定义
csharp
public static IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source);
功能 :反转序列中的元素顺序。
示例:
csharp
IEnumerable<int> reversed = numbers.Reverse(); // 反转序列
分组方法
GroupBy
定义
csharp
public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector, IEqualityComparer<TKey>? comparer);
public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, IEnumerable<TElement>, TResult> resultSelector);
public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector, IEqualityComparer<TKey>? comparer);
public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector);
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);
public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer);
public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, IEqualityComparer<TKey>? comparer);
功能 :根据指定的键将序列分割成多个组。
示例:根据长度将字符串分组。
csharp
var groups = strings.GroupBy(s => s.Length);
转换方法
- ToArray
定义
csharp
public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source);
功能 :将序列(集合或者数组)转换成数组。
示例:
csharp
int[] array = numbers.ToArray(); // 转换成数组
- ToList
定义
csharp
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source);
功能 :将序列(集合或者数组)转换成列表。
示例:
csharp
List<int> list = numbers.ToList(); // 转换成列表
- Select
定义
csharp
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
功能 :投影每个元素到新的形式。
示例:
csharp
var squaredNumbers = numbers.Select(n => n * n); // 将每个元素平方
其他方法
- Skip
定义
csharp
public static IEnumerable<TSource> Skip<TSource>(this IEnumerable<TSource> source, int count);
功能 :跳过序列中的前N个元素。
示例:跳过前两个元素
csharp
var skipped = numbers.Skip(2); // 跳过前两个元素
- Take
定义
csharp
public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, Range range);
public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count);
功能 :获取序列中的前N个元素。
示例:获取前三个元素
csharp
var taken = numbers.Take(3); // 获取前三个元素
这些方法提供了强大的数据处理能力,可以根据需要灵活运用。在实际开发中,经常会将这些方法组合起来使用,以达到复杂的数据查询和处理需求。后续会对这些方法结合实例进行详细讲解和应用。