扩展方法系列
C# 扩展方法简介
C# 扩展方法01 —— 扩展 String & StringBuidler
C# 扩展方法02 —— 扩展Byte
C#扩展方法03 —— 扩展IList
扩展 IEnumerable 接口的意义
IEnumerable 和IEnumerable 接口在 .NET 中是非常重要的接口,大多数集合类型都实现该接口以提供遍历、过滤、排序、搜索等功能。虽然这些操作有Linq
提供的便捷操作方法可以替代,但有些公司的项目中,出于跨平台、性能等方面的考虑,是禁止使用Linq的,所以需要一些替代方法的封装。同时也可以对该接口实现一些个性化需求的自定义扩展。
NULL Check 扩展
检查是否包含任意元素
public static bool Any<T>(this IEnumerable<T> source)
{
if (source == null) return false;
using (var enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext()) return true;
}
return false;
}
检查是否为空
public static bool IsEmpty<T>(this IEnumerable<T> source)
{
return !source.Any();
}
检查是否非空
public static bool IsNotEmpty<T>(this IEnumerable<T> source)
{
return source.Any();
}
Get 扩展
是否包含符合指定条件的元素
public static T Has<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
foreach (var item in source)
{
if (predicate(item)) return item;
}
return default(T);
}
查找符合指定条件的元素
public static T Find<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
var ret = default(T);
foreach (var item in source)
{
if (predicate(item))
{
ret = item;
break;
}
}
return ret;
}
查找所有符合条件的元素
public static List<T> FindAll<T>(this IEnumerable<T> source, Predicate<T> predicate)
{
var list = new List<T>();
foreach (var item in source)
{
if (predicate(item)) list.Add(item);
}
return list;
}
Foreach 扩展
遍历所有元素并执行某个操作
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (action == null) return source;
foreach (var item in source)
{
action(item);
}
return source;
}
遍历所有元素并对符合某个条件的元素执行某个操作
public static IEnumerable<T> ForEach<T>(this IEnumerable<T> source, Func<T, bool> selector, Action<T> action)
{
if (selector == null || action == null) return source;
foreach (var item in source)
{
if (!selector(item)) continue;
action(item);
}
return source;
}
Array & List 扩展
转换为列表
public static List<T> ToList<T>(this IEnumerable<T> source)
{
var list = new List<T>();
foreach (var item in source)
{
list.Add(item);
}
return list;
}
将元素转换为某个类型的列表
public static List<TResult> ToList<T, TResult>(this IEnumerable<T> source, Func<T, TResult> getter)
{
var list = new List<TResult>();
foreach (var item in source)
{
list.Add(getter(item));
}
return list;
}
转换为数组
public static T[] ToArray<T>(this IEnumerable<T> source)
{
var list = new List<T>();
foreach (var item in source)
{
list.Add(item);
}
return list.ToArray();
}
将元素转换为某个类型的数组
public static TResult[] ToArray<T, TResult>(this IEnumerable<T> source, Func<T, TResult> getter)
{
var list = new List<TResult>();
foreach (var item in source)
{
list.Add(getter(item));
}
return list.ToArray();
}
PS
本文只提供了IEnumerable 或者IEnumerable 的一种实现,有需要可以很容易修改出另一个版本,没有列举出的方法,很多都可以参考Linq中的实现并提取出来添加到具体项目中使用,但大量与Linq重复的扩展有违禁用Linq的初衷,扩展方法也需要结合实际情况考虑性能开销等问题,不能仅仅考虑简化开发,不宜过度滥用。