C#中Lambda奇技淫巧之Sum、Select、Average、Min、 Max

本文着重介绍Sum、Select、Average、Min、Max

  • 代码中所用到的源代码均是.Net6.0预览版中的代码
  • 源代码是截取案例中的代码,需要源代码可在github上自由下载

初始化案例中的函数演示所需的数据

Demo中对于各个函数分析是所需数据的初始化

List<int> listItem = new List<int>();
List<Student> listStudentItem = new List<Student>();

private void InitAggregate()
{
    listItem = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    listStudentItem = new List<Student> {
                        new Student("赵一",1),
                        new Student("钱二",2),
                        new Student("张三",3),
                        new Student("李四",4),
                        new Student("王五",5),
                        new Student("孙六",6),
                        new Student("周七",7),
                        new Student("吴八",8),
                        new Student("郑九",9),
                        new Student("冯十",10)
                    };
}

1. Sum

Sum顾名思义为求和

1.1. 代码案例

private void btnStructSum_Click(object sender, EventArgs e)
{
    int Sum=listItem.Sum();
    Console.WriteLine($"Sum:{Sum}");
    Console.WriteLine($"值列表:{string.Join(",", listItem)}");
    
    int SumAge = listStudentItem.Sum(a=>a.Age);
    Console.WriteLine($"SumAge:{SumAge}");
    Console.WriteLine($"引用列表:{string.Join(",", listStudentItem)}");
}

1.2. 案例效果

在这里插入图片描述

1.3. 源代码

public static partial class Enumerable
{
    public static int Sum(this IEnumerable<int> source)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }
        int sum = 0;
        checked
        {
            foreach (int v in source)
            {
                sum += v;
            }
        }
        return sum;
    }

    public static int Sum<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }

        if (selector == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
        }

        int sum = 0;
        checked
        {
            foreach (TSource item in source)
            {
                sum += selector(item);
            }
        }

        return sum;
    }
}

2. Select函数

Select函数一般与其他函数结合使用,如本案例中是和FindAll函数结合使用。

2.1. 代码案例

private void btnSelect_Click(object sender, EventArgs e)
{
    List<int> listSelect = listItem.FindAll(a => a < 6);
    Console.WriteLine($"值列表:{string.Join(",", listSelect)}");
    
    List<int> listSelectAge = listStudentItem.FindAll(a=>a.Age<6).Select(a => a.Age).ToList();
    Console.WriteLine($"值列表:{string.Join(",", listSelectAge)}");
}

2.2. 案例效果

在这里插入图片描述

2.3. 源代码

public List<T> FindAll(Predicate<T> match)
{
    if (match == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
    }

    List<T> list = new List<T>();
    for (int i = 0; i < _size; i++)
    {
        if (match(_items[i]))
        {
            list.Add(_items[i]);
        }
    }
    return list;
}

3.Average函数

Average函数求平均

private void btnAverage_Click(object sender, EventArgs e)
{
    double average = listItem.Average();
    Console.WriteLine($"值列表:{average}");

    average = listStudentItem.Average(a => a.Age);
    Console.WriteLine($"引用列表:{average}");
}

3.2. 案例效果

在这里插入图片描述

3.3. 源代码


public static partial class Enumerable
{
    public static double Average(this IEnumerable<int> source)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }
        using (IEnumerator<int> e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                ThrowHelper.ThrowNoElementsException();
            }
            long sum = e.Current;
            long count = 1;
            checked
            {
                while (e.MoveNext())
                {
                    sum += e.Current;
                    ++count;
                }
            }
            return (double)sum / count;
        }
    }
    public static double Average<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }
        if (selector == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
        }
        using (IEnumerator<TSource> e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                ThrowHelper.ThrowNoElementsException();
            }
            long sum = selector(e.Current);
            long count = 1;
            checked
            {
                while (e.MoveNext())
                {
                    sum += selector(e.Current);
                    ++count;
                }
            }
            return (double)sum / count;
        }
    }
}

4. Min\Max函数

4.1. 代码案例

private void btnMin_Click(object sender, EventArgs e)
{
    int Min= listItem.Min();
    Console.WriteLine($"值列表:{Min}");

    int MinAge = listStudentItem.Min(a=>a.Age);
    Console.WriteLine($"引用列表:{MinAge}");
}

private void btnMax_Click(object sender, EventArgs e)
{
    int Max = listItem.Max();
    Console.WriteLine($"值列表:{Max}");

    int MaxAge = listStudentItem.Max(a => a.Age);
    Console.WriteLine($"引用列表:{MaxAge}");
}

4.2. 案例效果

在这里插入图片描述
在这里插入图片描述

4.3. 源代码

Min源代码

public static partial class Enumerable
{
    public static int Min(this IEnumerable<int> source)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }

        int value;
        using (IEnumerator<int> e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                ThrowHelper.ThrowNoElementsException();
            }
            value = e.Current;
            while (e.MoveNext())
            {
                int x = e.Current;
                if (x < value)
                {
                    value = x;
                }
            }
        }
        return value;
    }

    public static int Min<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }

        if (selector == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
        }

        int value;
        using (IEnumerator<TSource> e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                ThrowHelper.ThrowNoElementsException();
            }
            value = selector(e.Current);
            while (e.MoveNext())
            {
                int x = selector(e.Current);
                if (x < value)
                {
                    value = x;
                }
            }
        }
        return value;
    }
}

Max源代码

public static partial class Enumerable
{
    public static int Max(this IEnumerable<int> source)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }

        int value;
        using (IEnumerator<int> e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                ThrowHelper.ThrowNoElementsException();
            }
            value = e.Current;
            while (e.MoveNext())
            {
                int x = e.Current;
                if (x > value)
                {
                    value = x;
                }
            }
        }
        return value;
    }

    public static int Max<TSource>(this IEnumerable<TSource> source, Func<TSource, int> selector)
    {
        if (source == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
        }

        if (selector == null)
        {
            ThrowHelper.ThrowArgumentNullException(ExceptionArgument.selector);
        }

        int value;
        using (IEnumerator<TSource> e = source.GetEnumerator())
        {
            if (!e.MoveNext())
            {
                ThrowHelper.ThrowNoElementsException();
            }
            value = selector(e.Current);
            while (e.MoveNext())
            {
                int x = selector(e.Current);
                if (x > value)
                {
                    value = x;
                }
            }
        }
        return value;
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自己的九又四分之三站台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值