// Copyright (c) 2025-2026 GeWuYou // SPDX-License-Identifier: Apache-2.0 namespace GFramework.Core.Extensions; /// /// 集合扩展方法 /// public static class CollectionExtensions { /// /// 对集合中的每个元素执行指定操作 /// /// 集合元素类型 /// 源集合 /// 要对每个元素执行的操作 /// 当 source 或 action 为 null 时抛出 /// /// /// var numbers = new[] { 1, 2, 3 }; /// numbers.ForEach(n => Console.WriteLine(n)); /// /// public static void ForEach(this IEnumerable source, Action action) { if (source is null) { throw new ArgumentNullException(nameof(source)); } if (action is null) { throw new ArgumentNullException(nameof(action)); } foreach (var item in source) action(item); } /// /// 检查集合是否为 null 或空 /// /// 集合元素类型 /// 要检查的集合 /// 如果集合为 null 或不包含任何元素,则返回 true;否则返回 false /// /// /// List<int>? numbers = null; /// if (numbers.IsNullOrEmpty()) { /* ... */ } /// /// public static bool IsNullOrEmpty(this IEnumerable? source) { return source is null || !source.Any(); } /// /// 过滤掉集合中的 null 元素 /// /// 集合元素类型(引用类型) /// 源集合 /// 不包含 null 元素的集合 /// 当 source 为 null 时抛出 /// /// /// var items = new string?[] { "a", null, "b", null, "c" }; /// var nonNull = items.WhereNotNull(); // ["a", "b", "c"] /// /// public static IEnumerable WhereNotNull(this IEnumerable source) where T : class { if (source is null) { throw new ArgumentNullException(nameof(source)); } return source.Where(item => item is not null)!; } /// /// 将集合转换为字典,如果存在重复键则使用最后一个值 /// /// 源集合元素类型 /// 字典键类型 /// 字典值类型 /// 源集合 /// 键选择器函数 /// 值选择器函数 /// 转换后的字典 /// 当 source、keySelector 或 valueSelector 为 null 时抛出 /// /// /// var items = new[] { ("a", 1), ("b", 2), ("a", 3) }; /// var dict = items.ToDictionarySafe(x => x.Item1, x => x.Item2); /// // dict["a"] == 3 (最后一个值) /// /// #pragma warning disable MA0016 // Preserve the established concrete return type for public API compatibility. public static Dictionary ToDictionarySafe( this IEnumerable source, Func keySelector, Func valueSelector) where TKey : notnull #pragma warning restore MA0016 { if (source is null) { throw new ArgumentNullException(nameof(source)); } if (keySelector is null) { throw new ArgumentNullException(nameof(keySelector)); } if (valueSelector is null) { throw new ArgumentNullException(nameof(valueSelector)); } var dictionary = new Dictionary(); foreach (var item in source) { var key = keySelector(item); var value = valueSelector(item); dictionary[key] = value; // 覆盖重复键 } return dictionary; } }