如何使用linq获取具有最小字段值的列表中的对象?

时间:2014-02-05 11:19:55

标签: c# linq

我想从列表中获取具有最低价格值的对象。 我按照方式做了但没有得到这个项目。我不想做订购。

cOrderItem oItem = this.OrderItems
                .Where(p => p.CategoryID == catID && p.n_IsOfferApplied == false)
                .Min(p => p.OrderItemPrice).FirstOrDefault();

4 个答案:

答案 0 :(得分:2)

您可以尝试按顺序获取第一个元素

cOrderItem oItem = this.OrderItems.
   Where(p => p.CategoryID == catID && p.n_IsOfferApplied == false).
   OrderBy(p => p.OrderItemPrice).FirstOrDefault()

这是一种工作,我不想让你使用但是因为你要求你不希望订购而不是

 var data = (from r in OrderItems
            where r.CategoryID == catID && r.n_IsOfferApplied == false
                   group r by r.CategoryID into g
                   select new { id = g.Key, data= g.Min(a=>a.OrderItemPrice) }).
                 FirstOrDefault();

 var cat =  from r in OrderItems
            join d in data data on d.id == r.CategoryID
            select r;

注意:我没有尝试使用解决方案,也不建议使用

答案 1 :(得分:1)

您必须将每个元素与集合中出现的最小值匹配。

cOrderItem oItem = this.OrderItems
            .Where(p => 
                       p.CategoryID == catID 
                       && p.n_IsOfferApplied == false

                       //Read as: "where the OrderItemPrice value is equal to the lowest occuring value in this.OrderItems
                       && p.OrderItemPrice == this.OrderItems.Min(q => q.OrderItemPrice))

            .FirstOrDefault();

如果您需要多个项目(如果它们具有相同的OrderItemPrice),您可以执行完全相同的查询,但最后删除.FirstorDefault()

答案 2 :(得分:0)

Min不返回item.It返回一个整数或双精度结果等。如果你想让项目首先获得最小值,那么将它与where子句一起使用

var minValue = this.OrderItems.Min(p => p.OrderItemPrice);
cOrderItem oItem = this.OrderItems.Where(p => p.CategoryID == catID 
                                             && p.n_IsOfferApplied == false
                                             &&  p.OrderItemPrice == minValue)
                                    .FirstOrDefault();

答案 3 :(得分:-1)

当您使用OrderBy时,它会在内存中创建新的有序源序列副本(并再次枚举源代码)。如果您想避免这种情况,可以使用MoreLINQ MinBy(可从NuGet获得)

cOrderItem oItem = OrderItems
                .Where(p => p.CategoryID == catID && !p.n_IsOfferApplied)
                .MinBy(p => p.OrderItemPrice);

注意:如果没有匹配项,它将抛出异常,因此如果可能找不到匹配项,您可以使用自己的扩展名返回默认值:

    public static T MinBy<T, TKey>(
        this IEnumerable<T> source, Func<T, TKey> selector)
    {
        // throw if source or selector is null
        using (var iterator = source.GetEnumerator())
        {
            if (!iterator.MoveNext())
               return default(T);

            var min = iterator.Current;
            var minKey = selector(min);
            IComparer<TKey> comparer = Comparer<TKey>.Default;

            while (iterator.MoveNext())
            {
                var current = iterator.Current;
                var currentKey = selector(current);
                if (comparer.Compare(currentKey, minKey) < 0)
                {
                    min = current;
                    minKey = currentKey;
                }
            }

            return min;
        }            
    }