我试图在列表中找到最低价格。问题是我正在寻找特定名称的最低价格(名称不一样,所以我必须指明我何时寻找最低价格)。
public class Sandelys : IComparable<Sandelys>, IEquatable<Sandelys>
{
public int Nr{ get; set; }
public string Name { get; set; }
public int Ammount { get; set; }
public double Price { get; set; }
...
}
这是我的方法
protected List<Sandelys> FormuotiUzsakyma(List<Sandelys> sandelys, Uzsakymas uzsk)
{
var query = sandelys.GroupBy(r => r.Name)
.Select(grp => new
{
Name = grp.Key,
Min = grp.Min(t=> t.Price)
});
//Here I'm trying to find the lowest price by name but it returns null
var min = sandelys.Min(r => r.Price);
//This finds the lowest price but it's in the whole list, not by a specific name
return sandelys;
}
答案 0 :(得分:1)
它应该只返回具有相同名称和最低价格的Sandelys对象
我会为这个
创建一个字典var dict = sandelys.GroupBy(x => x.Name).ToDictionary(g => g.Key, g => g.Min(y => y.Price));
答案 1 :(得分:1)
如果您只需要特定名称的最低价格,则可以使用Where
子句过滤Name
属性,然后使用OrderBy
按顺序对匹配项目进行排序Price
属性,然后返回First
一个(这将是最低价格)。
请注意,这些方法需要using System.Linq;
private static Sandelys GetLowestPriceByName(List<Sandelys> sandelys, string name)
{
return sandelys?.Where(s => s.Name == name).OrderBy(s => s.Price).FirstOrDefault();
}
答案 2 :(得分:0)
在我看来,您在Select
中丢失了太多信息。我建议使用MoreLINQ库,使用MinBy
方法。然后你可以:
protected List<Sandelys> FormuotiUzsakyma(List<Sandelys> sandelys, Uzsakymas uzsk) =>
sandelys.GroupBy(s => s.Name)
.Select(g => g.MinBy(s => s.Price))
.ToList();
如果您不能使用MoreLINQ,您可以按价格订购每个组,并从每个订购的组中获取第一个结果,但它更丑陋且效率更低:
protected List<Sandelys> FormuotiUzsakyma(List<Sandelys> sandelys, Uzsakymas uzsk) =>
sandelys.GroupBy(s => s.Name)
.Select(g => g.OrderBy(s => s.Price).First())
.ToList();
顺便说一句,您似乎根本没有使用uzsk
参数。