首页 > 解决方案 > 根据条件在列表中保留不同的值

问题描述

我有一个列表,我在 linQ 中应用以下条件:

我想选择名称包含某个字符串的所有项目。

var nameFilter = result
                     .Where(e => e.Name.Contains(requestedValue))
                     .ToList();

最后,有时会发生我有一个重复名称的列表:

例如:

requestedValue = 'form';

我最终得到:

Name           Price
transformer    100
transformer    20 
formation      340
former         201

我得到了transformer两次。在这种情况下,我只想以最低的价格离开变压器:20

我怎么能在没有循环的情况下用 linQ 做到这一点?

标签: c#linq

解决方案


你可以利用GroupBy方法

 var nameFilter = result.Where(e => e.Name.Contains(requestedValue))
    .GroupBy(k=>k.Name, g=>g.Price, (k,g)=>new Model {Name = k, Price = g.Min()})
    .ToList();

wherenew Model应该更改为您的班级名称。

如果您有更多属性要返回,可能会更方便

 var nameFilter = result.Where(e => e.Name.Contains(requestedValue))
            .GroupBy(k => k.Name, g => g, (k, g) =>
            {
                var minPrice = g.Min(x => x.Price);
                return g.First(x => x.Price == minPrice);
            }).ToList();

可以通过单个 for 循环来查找minPrice和查找项目,或者,例如,通过使用以下讨论hereminPrice


推荐阅读