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

目录

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

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

[方法三:使用 RemoveAll(移除所有最大值)](#方法三:使用 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 获取最大属性值,再用 FirstWhere 找到对应对象并移除。

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

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
Chester_19995 小时前
CSP202203C.计算资源调度器
开发语言·数据结构·c++·蓝桥杯
EXI-小洲7 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
会周易的程序员7 小时前
给 PLC 写一个字节码虚拟机:STVM 虚拟机架构设计
开发语言·c++·虚拟机·软plc·iec61131·stvm
机器视觉知识推荐、就业指导7 小时前
为什么老说“纯 Qt 没啥就业市场”?
开发语言·qt
telepan7 小时前
Qt 开发避坑与性能指南:如何优雅、安全地定义全局常量字符串?
开发语言·qt
m0_695251497 小时前
Qt MaintenanceTool 使用国内镜像加速下载(超详细教程)
开发语言·qt
大衛說9 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
可乐鸡翅yeah_10 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_9622035110 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理10 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php