【C# 】 一个List<T> 如何快速的知道里面的最大、最小、平均值呢?

在C#中,要从一个List<T>中找到最大值、最小值和平均值,首先需要确保列表中的元素类型支持这些操作(例如int、ushort或double)。

这里使用LINQ(Language Integrated Query)来简化这些计算。

如果使用的是C# 8.0及以上版本,还可以利用范围变量(range variables)来进一步简化代码。

使用LINQ

List<ushort>示例代码

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<ushort> numbers = new List<ushort> { 5, 10, 15, 20, 25 };

        ushort max = numbers.Max();
        ushort min = numbers.Min();

        double average = numbers.Select(x => (double)x).Average();  // 先将 ushort 转换为 double 再计算平均值

        Console.WriteLine("最大值: " + max);
        Console.WriteLine("最小值: " + min);
        Console.WriteLine("平均值: " + average);
    }
}

List<int>示例代码

cs 复制代码
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };

        // 使用 LINQ 查询语法
        int max = numbers.Max();
        int min = numbers.Min();
        double average = numbers.Average();

        Console.WriteLine($"Max: {max}");
        Console.WriteLine($"Min: {min}");
        Console.WriteLine($"Average: {average}");
    }
}

List<double> 示例代码

cs 复制代码
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 如果是 double 类型的列表
        List<double> numbersDouble = new List<double> { 1.1, 3.3, 5.5, 7.7, 9.9 };
        double maxDouble = numbersDouble.Max();
        double minDouble = numbersDouble.Min();
        double averageDouble = numbersDouble.Average();

        Console.WriteLine($"Max (double): {maxDouble}");
        Console.WriteLine($"Min (double): {minDouble}");
        Console.WriteLine($"Average (double): {averageDouble}");
    }
}

注意事项

代码中,Max(), Min()Average() 方法都是LINQ扩展方法,它们可以直接作用于任何实现了IEnumerable<T>接口的集合上。这些方法会返回相应的最大值、最小值和平均值。

  • 对于非数值类型的T,这些操作可能无法直接应用。
  • 如果列表为空,则Max()Min() 会抛出异常,而Average()则返回0(对于整数类型)或0.0(对于浮点数类型)。
  • 在实际应用中,最好添加一些错误处理逻辑以避免程序因空列表而崩溃。

使用范围变量(range variables)

在C# 8.0及更高版本中,可以使用范围变量(range variables)来简化对序列的访问。不过,在本例中,范围变量主要用于索引或切片操作,并不直接简化获取最大值、最小值和平均值的操作。但我们可以结合范围变量来展示如何简洁地处理数据。

如果想要使用范围变量来遍历列表并计算最大值、最小值和平均值,可以按照以下方式进行:

cs 复制代码
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };

        // 计算最大值、最小值和平均值
        int max = numbers.Max();
        int min = numbers.Min();
        double average = numbers.Average();

        // 使用 range variables 打印每个元素
        foreach (var n in numbers)
        {
            Console.WriteLine(n);
        }

        // 或者使用 range variables 和 _ (下划线)作为占位符
        for (int i = 0; i < numbers.Count; i++)
        {
            Console.WriteLine($"Element at index {i}: {numbers[i]}");
        }

        Console.WriteLine($"Max: {max}");
        Console.WriteLine($"Min: {min}");
        Console.WriteLine($"Average: {average}");
    }
}

在这个例子中,我们使用了简单的foreach循环和for循环来遍历列表。虽然这里没有直接用到范围变量来简化最大值、最小值和平均值的计算,但你可以使用范围变量来简化其他方面的代码,比如访问列表的子集或进行切片操作。

如果想要使用范围变量来处理列表的一部分,可以考虑下面的例子:

cs 复制代码
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };

        // 获取前三个元素
        var firstThree = numbers[0..3];
        Console.WriteLine("First three elements:");
        foreach (var n in firstThree)
        {
            Console.WriteLine(n);
        }

        // 获取除了前两个的所有元素
        var exceptFirstTwo = numbers[2..];
        Console.WriteLine("Elements except the first two:");
        foreach (var n in exceptFirstTwo)
        {
            Console.WriteLine(n);
        }

        // 获取除了最后两个的所有元素
        var exceptLastTwo = numbers[..^2];
        Console.WriteLine("Elements except the last two:");
        foreach (var n in exceptLastTwo)
        {
            Console.WriteLine(n);
        }

        // 计算最大值、最小值和平均值
        int max = numbers.Max();
        int min = numbers.Min();
        double average = numbers.Average();

        Console.WriteLine($"Max: {max}");
        Console.WriteLine($"Min: {min}");
        Console.WriteLine($"Average: {average}");
    }
}

在这个例子中,我们使用了范围变量来获取列表的不同部分,并打印出来。这可以让你更容易地处理列表的子集。但是,对于最大值、最小值和平均值的计算,还是使用LINQ的方法更加简洁。

相关推荐
mudtools2 天前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
大飞pkz2 天前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
凯子坚持 c2 天前
精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
c++·redis·list
唐青枫2 天前
从入门到进阶:C#.NET Stopwatch 计时与性能测量全攻略
c#·.net
第七序章2 天前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
未来之窗软件服务2 天前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
1uther2 天前
Unity核心概念⑨:Screen
开发语言·游戏·unity·c#·游戏引擎
阿幸软件杂货间2 天前
Office转PDF转换器v1.0.py
开发语言·pdf·c#
sali-tec2 天前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
Tiger_shl2 天前
【层面一】C#语言基础和核心语法-02(反射/委托/事件)
开发语言·c#