按名称查找列表中的最小值

时间:2018-06-12 20:25:12

标签: c# linq

我试图在列表中找到最低价格。问题是我正在寻找特定名称的最低价格(名称不一样,所以我必须指明我何时寻找最低价格)。

 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;
        }

3 个答案:

答案 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参数。