C#之List移除某个属性值中最大的值方式

 更新时间:2026年06月05日 09:52:28   作者:hefeng_aspnet  
这段个方法教你如何在C#中移除ListListList中属性值最大的大的元素,涵盖.NET6的MaxBy、MaxFirst/与RemoveAll等种实现方式,助你高效管理列表数据

在 C# 中移除 List 中某个属性值最大的元素,通常分为两步:首先找到该最大值对应的对象(或最大值本身),然后从列表中移除它。

以下是几种常见的实现方式,根据 .NET 版本和需求选择:

方法一:使用 MaxBy(推荐,.NET 6+)

如果你使用的是 .NET 6 或更高版本,MaxBy 是最简洁且高效的方法,它直接返回具有最大属性值的对象。

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Score { get; set; }
        public override string ToString() => $"Id:{Id}, Name:{Name}, Score:{Score}";
    }
    public static void Main()
    {
        var list = new List<Item>
        {
            new Item { Id = 1, Name = "A", Score = 10 },
            new Item { Id = 2, Name = "B", Score = 50 }, // 最大值
            new Item { Id = 3, Name = "C", Score = 30 }
        };
        Console.WriteLine("移除前:");
        list.ForEach(i => Console.WriteLine(i));
        // 1. 找到 Score 属性最大的对象
        // MaxBy 返回的是对象本身,如果有多个最大值,返回第一个
        var maxItem = list.MaxBy(x => x.Score);
        if (maxItem != null)
        {
            // 2. 从列表中移除该对象
            list.Remove(maxItem);
        }
        Console.WriteLine("\n移除后:");
        list.ForEach(i => Console.WriteLine(i));
    }
}

代码说明:

  • 1. 使用 MaxBy 直接获取属性值最大的对象引用,避免二次查找。
  • 2. 调用 Remove 方法移除该引用指向的对象。
  • 3. 需确保项目目标框架为 .NET 6+。

方法二:使用 Max + First/FirstOrDefault(兼容旧版本)

在 .NET 5 及更早版本中,可以先用 Max 获取最大属性值,再用 First 或 Where 找到对应对象并移除。

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Score { get; set; }
        public override string ToString() => $"Id:{Id}, Name:{Name}, Score:{Score}";
    }
    public static void Main()
    {
        var list = new List<Item>
        {
            new Item { Id = 1, Name = "A", Score = 10 },
            new Item { Id = 2, Name = "B", Score = 50 },
            new Item { Id = 3, Name = "C", Score = 30 }
        };
        if (list.Any())
        {
            // 1. 获取最大的属性值
            int maxScore = list.Max(x => x.Score);
            // 2. 找到第一个具有该最大值的对象
            var itemToRemove = list.FirstOrDefault(x => x.Score == maxScore);
            if (itemToRemove != null)
            {
                // 3. 移除
                list.Remove(itemToRemove);
            }
        }
        list.ForEach(i => Console.WriteLine(i));
    }
}

代码说明:

  • 1. 先计算最大值,再遍历查找匹配的对象。
  • 2. 此方法会遍历列表两次(一次 Max,一次 FirstOrDefault),性能略低于 MaxBy 或单次循环。
  • 3. 适用于所有支持 LINQ 的 .NET 版本。

方法三:使用 RemoveAll(移除所有最大值)

如果存在多个对象拥有相同的最大属性值,且你希望全部移除,可以使用 RemoveAll

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
    public class Item
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Score { get; set; }
        public override string ToString() => $"Id:{Id}, Name:{Name}, Score:{Score}";
    }
    public static void Main()
    {
        var list = new List<Item>
        {
            new Item { Id = 1, Name = "A", Score = 50 }, // 最大值
            new Item { Id = 2, Name = "B", Score = 50 }, // 最大值
            new Item { Id = 3, Name = "C", Score = 30 }
        };
        if (list.Any())
        {
            int maxScore = list.Max(x => x.Score);
            // 移除所有 Score 等于 maxScore 的元素
            list.RemoveAll(x => x.Score == maxScore);
        }
        list.ForEach(i => Console.WriteLine(i));
    }
}

代码说明:

  • 1. 先获取最大值。
  • 2. 使用 RemoveAll 一次性移除所有符合条件的元素。
  • 3. 适合需要清理所有并列最大值场景。

注意事项

  1. 空集合检查‌:在调用 Max 或 MaxBy 之前,务必检查列表是否为空(使用 Any() 或判断 Count > 0),否则会抛出 InvalidOperationException
  2. 引用类型移除‌:List.Remove 依赖于对象的相等性比较。对于引用类型,默认比较引用地址。上述方法中,我们移除的是从列表中取出的同一引用对象,因此能成功移除。如果是新建一个属性值相同但引用不同的对象,Remove 将失败。
  3. 性能‌:MaxBy 是单次遍历,性能最优。Max + First 是两次遍历。OrderByDescending().First() 也是常见写法,但排序开销较大(O(N log N)),不建议仅为了取最大值而使用排序。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C# SendMail发送邮件功能实现

    C# SendMail发送邮件功能实现

    这篇文章主要为大家详细介绍了C# SendMail发送邮件功能实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • C#中winform实现自动触发鼠标、键盘事件的方法

    C#中winform实现自动触发鼠标、键盘事件的方法

    这篇文章主要介绍了C#中winform实现自动触发鼠标、键盘事件的方法,是C#程序设计中非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • C#中Parallel类For、ForEach和Invoke使用介绍

    C#中Parallel类For、ForEach和Invoke使用介绍

    这篇文章介绍了C#中Parallel类For、ForEach和Invoke的使用方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#使用GDI+实现生成验证码

    C#使用GDI+实现生成验证码

    这篇文章介绍了C#使用GDI+实现生成验证码的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#实现QR Code二维码生成与美化教程

    C#实现QR Code二维码生成与美化教程

    二维码在现代生活中扮演着重要角色,它们为信息传递提供了便捷的方式,这篇文章主要介绍了使用C#实现QR Code二维码生成与美化的详细步骤,有需要的小伙伴可以了解下
    2026-04-04
  • 浅谈C#设计模式之工厂模式

    浅谈C#设计模式之工厂模式

    这篇文章主要介绍了浅谈C#设计模式之工厂模式,需要的朋友可以参考下
    2014-12-12
  • C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    今天小编就为大家分享一篇关于C#中通过使用Connection类来实现打开/关闭数据库的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • C#实现俄罗斯方块基本功能

    C#实现俄罗斯方块基本功能

    这篇文章主要为大家详细介绍了C#实现俄罗斯方块的基本功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • C# 多线程更新界面的错误的解决方法

    C# 多线程更新界面的错误的解决方法

    这篇文章主要介绍了C# 多线程更新界面的错误方法,由于一个线程的程序,如果调用一个功能是阻塞的,那么就会影响到界面的更新,导致使用人员操作不便。所以往往会引入双线程的工作的方式,主线程负责更新界面和调度,而次线程负责做一些阻塞的工作,便有了下面春雨里方法
    2021-10-10
  • C#创建简单windows窗体应用(加法器)

    C#创建简单windows窗体应用(加法器)

    这篇文章主要为大家详细介绍了C#创建一个简单windows窗体应用的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03

最新评论