如何用LinQ筛选含指定字符串的列表并保留同名最低价格项?
解决LinQ筛选后保留同名最低价条目的方案
这问题我做项目时也碰到过!完全可以用LinQ的组合方法搞定,不用写手动循环。核心思路是先按名称分组,再从每个分组里挑出价格最低的条目,下面给你两种可行的写法:
方法一:排序取首项(直观易读)
这种写法逻辑清晰,容易理解,适合大多数常规场景:
var nameFilter = result .Where(e => e.Name.Contains(requestedValue)) // 先按关键词筛选目标项 .GroupBy(e => e.Name) // 将所有同名项归为一个分组 .Select(group => group.OrderBy(e => e.Price).First()) // 每组按价格升序排序,取第一个(即最低价条目) .ToList();
逻辑拆解:
GroupBy(e => e.Name)会把名称相同的元素聚合到同一分组中;OrderBy(e => e.Price)将当前分组内的元素按价格从小到大排序;First()直接取排序后的第一个元素,也就是该名称下价格最低的条目。
方法二:用Aggregate直接找最小值(性能更优)
如果你的数据集很大、每个分组里的元素数量较多,推荐用这种写法——它不需要对分组排序,而是逐个比较找出最小值,性能效率更高:
var nameFilter = result .Where(e => e.Name.Contains(requestedValue)) .GroupBy(e => e.Name) .Select(group => group.Aggregate((currentMin, nextItem) => nextItem.Price < currentMin.Price ? nextItem : currentMin)) .ToList();
逻辑拆解:
Aggregate会遍历分组内的每一个元素,每次对比当前记录的最小值和下一个元素的价格,始终保留价格更低的那个,最终得到整个分组里价格最低的条目。
内容的提问来源于stack exchange,提问作者HelpASisterOut
相关产品推荐
相关产品推荐

