使用Linq返回最小值的行

时间:2014-12-18 09:50:18

标签: c# linq

我有2个这样的课程:

public partial class Product
{
    public ICollection<ProductTerm> ProductTerms { get; set; }
    // More properties here
}

public partial class ProductTerm
{
    public short ID { get; set; }
    public short MinTermDuration { get; set; }
    // More properties here
}

正如您将看到的,Product与ProductTerm有1对多的关系。

我正在尝试使用Min MinTermDuration返回整个ProductTerm。我可以在这里获得我想要的结果但是返回MinTermDuration - 如何返回整个ProductTerm?

    int GetMinTerm()
    {
        return ProductTerms.Min(t => t.MinTermDuration);
    } 

3 个答案:

答案 0 :(得分:5)

您可以先订购产品,然后再将第一个产品放在最上面。

return ProductTerms.OrderBy(t => t.MinTermDuration).FirstOrDefault();

答案 1 :(得分:1)

Min返回最小值,而不是具有值的项目。您可以使用First获取ProductTerm的<{1}}:

MinTermDuration

另一种选择是使用MinBy方法,它需要使用thir-party库,但更直接:

ProductTerm GetMinTerm()
{
    var min = ProductTerms.Min(t => t.MinTermDuration);
    return ProductTerms.First(x => x.MinTermDuration == min);
} 

答案 2 :(得分:1)

你可以按照Vsevolod Goloviznin的建议使用OrderBy(...).FirstOrDefault();然而,这种方法需要对集合进行排序,其复杂度为O(n log n) ...... Selman22建议的方法更好,但它仍然枚举结果两次(如果序列是实体框架,这可能是一个问题或OData查询)。

更好的选择是使用MinBy扩展方法,只需循环一次,然后返回具有最小值的项,复杂度为O(n)

return ProductTerms.MinBy(t => t.MinTermDuration);

您可以在Linq.ExtrasMoreLinq中找到此类方法。


编辑:如果您正在使用内存中的集合(Linq to Objects),,如果您正在使用数据库(使用实体框架),则上述情况属实例如)。 DB知道如何有效地找到具有最小值的项目;在这种情况下使用MinBy将获取所有行以检查它们,因此效率非常低。