public static IEnumerable <TSource> Distinct <TSource>(IEnumerable <TSource> source, IEqualityComparer <TSource> comparer = null)
        {
            var _result = new List <TSource>();

            EnumerableUtil.Each(source, x => {
                if (EnumerableUtil.FirstOrDefault(_result, y => comparer != null ? comparer.Equals(x, y) : x.Equals(y)) == null)
                {
                    _result.Add(x);
                }
            });
            return(_result);
        }
        public static int Find <TSource>(IEnumerable <TSource> source, Func <TSource, bool> predicate, int defaultValue)
        {
            var _index = -1;

            if (EnumerableUtil.FirstOrDefault(source, x => {
                _index++;
                return(predicate(x));
            }) == null)
            {
                return(defaultValue);
            }

            return(_index);
        }
 public static IEnumerable <TSource> Except <TSource>(IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer = null)
 {
     return(EnumerableUtil.Where(first, x => EnumerableUtil.FirstOrDefault(second, y => comparer != null ? comparer.Equals(x, y) : x.Equals(y)) == null));
 }