【C# / Extension】 扩展方法04 —— 扩展IEnumerable

扩展方法系列

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的初衷,扩展方法也需要结合实际情况考虑性能开销等问题,不能仅仅考虑简化开发,不宜过度滥用。

你可能感兴趣的:(C#,.NET,Unity3D)