集合处理
集合处理(CollectionExtensions)
Merge<TKey, TValue>
功能描述
合并字典中的键值对。如果字典中已存在指定的键,则使用指定的函数对原有值和新值进行合并;否则直接添加键值对。
参数
Dictionary<TKey, TValue> self
:要合并的字典。TKey k
:要添加或合并的键。TValue v
:要添加或合并的值。Func<TValue, TValue, TValue> func
:用于合并值的函数。
返回值
无返回值,直接修改传入的字典。
应用场景
当需要在字典中添加或更新键值对,并在更新时根据特定逻辑合并值时使用。
示例代码
csharp
public static void Merge<TKey, TValue>(this Dictionary<TKey, TValue> self, TKey k, TValue v, Func<TValue, TValue, TValue> func)
{
self[k] = self.TryGetValue(k, out var value) ? func(value, v) : v;
}
// 使用示例
var dictionary = new Dictionary<string, int>();
dictionary.Merge("key1", 10, (x, y) => x + y);
dictionary.Merge("key2", 20, (x, y) => x + y);
GetOrAdd<TKey, TValue>
功能描述
获取指定键的值,如果字典中不存在该键,则使用指定的函数获取值并添加到字典中。
参数
Dictionary<TKey, TValue> self
:要操作的字典。TKey key
:要获取值的键。Func<TKey, TValue> valueGetter
:用于获取值的函数。
返回值
返回指定键的值,类型为TValue
。
应用场景
当需要在字典中获取值,且在键不存在时自动添加键值对时使用。
示例代码
csharp
public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> self, TKey key, Func<TKey, TValue> valueGetter)
{
if (!self.TryGetValue(key, out var value))
{
value = valueGetter(key);
self[key] = value;
}
return value;
}
// 使用示例
var dictionary = new Dictionary<string, int>();
var value = dictionary.GetOrAdd("key1", k => k.GetHashCode());
GetOrAdd<TKey, TValue>
功能描述
获取指定键的值,如果字典中不存在该键,则使用无参构造函数创建一个新的值并添加到字典中。
参数
Dictionary<TKey, TValue> self
:要操作的字典。TKey key
:要获取值的键。
返回值
返回指定键的值,类型为TValue
。
应用场景
当需要在字典中获取值,且在键不存在时自动添加键值对,且值类型具有无参构造函数时使用。
示例代码
csharp
public static TValue GetOrAdd<TKey, TValue>(this Dictionary<TKey, TValue> self, TKey key) where TValue : new()
{
return GetOrAdd(self, key, k => new TValue());
}
// 使用示例
var dictionary = new Dictionary<string, int>();
var value = dictionary.GetOrAdd("key1");
RemoveIf<TKey, TValue>
功能描述
根据指定条件从字典中移除键值对。
参数
Dictionary<TKey, TValue> self
:要操作的字典。Func<TKey, TValue, bool> predict
:判断是否移除键值对的条件。
返回值
返回移除的键值对数量,类型为int
。
应用场景
当需要根据特定条件从字典中移除元素时使用。
示例代码
csharp
public static int RemoveIf<TKey, TValue>(this Dictionary<TKey, TValue> self, Func<TKey, TValue, bool> predict)
{
int count = 0;
foreach (var kv in self)
{
if (predict(kv.Key, kv.Value))
{
self.Remove(kv.Key);
count++;
}
}
return count;
}
// 使用示例
var dictionary = new Dictionary<string, int>();
dictionary.Add("key1", 10);
dictionary.Add("key2", 20);
var removedCount = dictionary.RemoveIf((k, v) => v > 15);
IsNullOrEmpty<T>
功能描述
检查集合是否为 null 或空。
参数
ICollection<T> self
:要检查的集合。
返回值
如果集合为 null 或空,则为 true;否则为 false,类型为bool
。
应用场景
用于在操作集合前检查其是否为空,避免空引用异常。
示例代码
csharp
public static bool IsNullOrEmpty<T>(this ICollection<T> self)
{
return self == null || self.Count <= 0;
}
// 使用示例
var list = new List<int>();
bool isEmpty = list.IsNullOrEmpty();
Random<T>
功能描述
从列表中随机获取一个对象。
参数
List<T> list
:要随机的列表。
返回值
返回随机获取的对象,类型为T
。
应用场景
当需要从列表中随机选择一个元素时使用。
示例代码
csharp
public static T Random<T>(this List<T> list)
{
int n = list.Count;
var r = ThreadLocalRandom.Current;
int index = r.Next(n);
return list[index];
}
// 使用示例
var list = new List<int> { 1, 2, 3, 4, 5 };
var randomItem = list.Random();
Shuffer<T>
功能描述
打乱列表中的元素顺序。
参数
List<T> list
:要打乱顺序的列表。
返回值
无返回值,直接修改传入的列表。
应用场景
当需要随机打乱列表元素顺序时使用。
示例代码
csharp
public static void Shuffer<T>(this List<T> list)
{
int n = list.Count;
var r = ThreadLocalRandom.Current;
for (int i = 0; i < n; i++)
{
int rand = r.Next(i, n);
(list[i], list[rand]) = (list[rand], list[i]);
}
}
// 使用示例
var list = new List<int> { 1, 2, 3, 4, 5 };
list.Shuffer();
RemoveIf<T>
功能描述
从列表中移除满足条件的元素。
参数
List<T> list
:要操作的列表。Predicate<T> condition
:用于判断元素是否满足移除条件的委托。
返回值
无返回值,直接修改传入的列表。
应用场景
当需要根据特定条件从列表中移除元素时使用。
示例代码
csharp
public static void RemoveIf<T>(this List<T> list, Predicate<T> condition)
{
var idx = list.FindIndex(condition);
while (idx >= 0)
{
list.RemoveAt(idx);
idx = list.FindIndex(condition);
}
}
// 使用示例
var list = new List<int> { 1, 2, 3, 4, 5 };
list.RemoveIf(x => x % 2 == 0);
AddRange<T>
功能描述
将一个可枚举集合的元素添加到哈希集合中。
参数
HashSet<T> c
:要添加元素的哈希集合。IEnumerable<T> e
:要添加的元素的可枚举集合。
返回值
无返回值,直接修改传入的哈希集合。
应用场景
当需要将多个元素添加到哈希集合中时使用。
示例代码
csharp
public static void AddRange<T>(this HashSet<T> c, IEnumerable<T> e)
{
foreach (var item in e)
{
c.Add(item);
}
}
// 使用示例
var set = new HashSet<int>();
set.AddRange(new List<int> { 1, 2, 3, 4, 5 });