【Unity通用工具类】列表扩展方法ListExtensions

  • 判断集合是否为 null 或不包含任何元素
csharp 复制代码
/// <summary>
/// 判断集合是否为 null 或不包含任何元素
/// 无需遍历整个集合即可获取元素数量
/// 使用LINQ's Any()方法判断集合是否为空
/// 会产生一些垃圾回收开销
/// </summary>
/// <param name="list">List to evaluate</param>
public static bool IsNullOrEmpty<T>(this IList<T> list) {
	return list == null || !list.Any();
}
  • 复制列表
csharp 复制代码
/// <summary>
/// 创建一个新的列表,它是原始列表的副本
/// </summary>
/// <param name="list">需要复制的原始列表</param>
/// <returns>返回复制列表</returns>
public static List<T> Clone<T>(this IList<T> list) {
	List<T> newList = new List<T>();
	foreach (T item in list) {
		newList.Add(item);
	}
	return newList;
}
  • 更新列表内容
csharp 复制代码
/// <summary>
/// 更新列表内容
/// </summary>
/// <param name="list"></param>
/// <param name="items"></param>
/// <typeparam name="T"></typeparam>
public static void RefreshWith<T>(this List<T> list, IEnumerable<T> items)
{
	list.Clear();
	list.AddRange(items);
}
  • 交换元素
csharp 复制代码
/// <summary>
/// 交换列表中指定索引处的两个元素。
/// </summary>
/// <param name="list">列表</param>
/// <param name="indexA">第一个元素的索引</param>
/// <param name="indexB">第二个元素的索引</param>
public static void Swap<T>(this IList<T> list, int indexA, int indexB) {
	(list[indexA], list[indexB]) = (list[indexB], list[indexA]);
}
  • 打乱列表
csharp 复制代码
/// <summary>
/// 使用 Fisher-Yates 算法的 Durstenfeld 实现方法对列表中的元素进行随机排序
/// 此方法会就地修改输入列表,确保每个排列出现的概率均等,并返回修改后的列表,以便进行方法链式调用
/// 参考: http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
/// </summary>
/// <param name="list">需要打乱顺序的列表</param>
/// <typeparam name="T">列表中元素的类型</typeparam>
/// <returns>打乱顺序后的列表</returns>
public static IList<T> Shuffle<T>(this IList<T> list) {
	Random rng = new Random();
	int count = list.Count;
	while (count > 1) {
	--count;
	int index = rng.Next(count + 1);
	(list[index], list[count]) = (list[count], list[index]);
	}
	return list;
}
  • 过滤集合
csharp 复制代码
/// <summary>
/// Filters a collection based on a predicate and returns a new list根据条件过滤集合并返回一个新的列表。
/// containing the elements that match the specified condition.包含符合指定条件的元素。
/// </summary>
/// <param name="source">The collection to filter.需要过滤的集合</param>
/// <param name="predicate">The condition that each element is tested against.用于测试每个元素的条件。</param>
/// <returns>A new list containing elements that satisfy the predicate.一个包含满足条件的元素的新列表。</returns>
public static IList<T> Filter<T>(this IList<T> source, Predicate<T> predicate) {
	List<T> list = new List<T>();
	foreach (T item in source) {
		if (predicate(item)) {
			list.Add(item);
		}
	}
	return list;
}
相关推荐
weixin_424294671 小时前
对于未加入 Script Execution Order 的脚本
unity
暴走约伯1 小时前
【VFX工具链源码拆解 03】告别机械劳动(下):材质字典映射批处理与智能纹理槽识别
unity·游戏引擎·材质
Wanda12142 小时前
机器人与机电一体化3D数字孪生机器-Day9
人工智能·3d·unity·机器人·数字孪生
吾与谁归in2 小时前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
眺望电子-ARM嵌入式2 小时前
边缘语音交互落地参考:RK3572+VITS 本地化 TTS 部署
交互
昂好的day2 小时前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf
暴走约伯2 小时前
【VFX工具链源码拆解 01】总体架构:大型项目特效流程的程序化落地
开发语言·经验分享·3d·unity·架构·游戏引擎
华普微HOPERF17 小时前
Matter协议架构详解:数据模型与交互模型深度解析
microsoft·架构·交互
吃一碗粉只付一碗钱20 小时前
10-令牌里的用户主键不要明文
服务器·数据库·sql·sqlserver·c#