我想从列表中获取具有最低价格值的对象。 我按照方式做了但没有得到这个项目。我不想做订购。
cOrderItem oItem = this.OrderItems
.Where(p => p.CategoryID == catID && p.n_IsOfferApplied == false)
.Min(p => p.OrderItemPrice).FirstOrDefault();
答案 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;
}
}