我面临排序列表的问题,我试图找到最便宜的价值。排序不是问题,它返回的值是问题和我想要满足的条件。
基本上我的结果集中可能有0个值,这是因为这些项目已被暂时搁置,因此它们没有保留值,但引用仍然为它们到达。
我们的想法是按总价值对结果进行排序,然后选择列表中的第一项,理论上它是最便宜的。
void Main()
{
GetCheapest();
}
public void GetCheapest()
{
List<Car> numbers = new List<Car>
{
new Car() { Type="dearest", Total = 990 },
new Car() { Type="", Total = 570 },
new Car() { Type="", Total = 907 },
new Car() { Type="cheapest", Total = 0 },
new Car() { Type="", Total = 333 },
new Car() { Type="", Total = 435 },
new Car() { Type="", Total = 435 }
};
//order ascending
IEnumerable<Car> query = numbers.OrderBy( q => q.Total );
//set the cheapest to be the first index in the sorted IEnumerable
var cheapest = query.First();
//output the cheapest
Console.Write( cheapest.Type + " - £" + cheapest.Total + ", Winning!!" );
//new line
Console.WriteLine( Environment.NewLine );
//output each one
foreach( Car q in query )
{
Console.WriteLine( q.Type + " - £" + q.Total );
}
}
//Quote Object
public class Car
{
public decimal Total { get; set; }
public string Type { get; set; }
}
总结 我想迭代返回的列表,直到我到达一个保持值大于0的索引。
给出的例子的答案是333。
如果有人有任何更好的想法,我可以尝试这些。
到目前为止,我已经在SO上查看过这些问题不会得出答案:
答案 0 :(得分:7)
除非我遗漏了某些东西,否则它只会是:
numbers.Where(c => c.Total > 0)
.OrderBy(c => c.Total)
.First();
或链接到您现有的查询:
IEnumerable<Car> query = numbers.OrderBy( q => q.Total );
var cheapestCar =
query.Where(c => c.Total > 0)
.First();
答案 1 :(得分:3)
int cheapest = numbers.Where(c=>c.Total > 0).Min(c=>c.Total);
会在列表中为您提供大于0的最低价格。
where子句从列表中删除总计&lt; = 0的任何内容。 min调用返回最小的剩余值。
如果您希望拥有整个对象而不仅仅是价格,请使用
var cheapest = numbers.OrderBy(c=>c.Total).First(c=>c.Total > 0);
答案 2 :(得分:2)
如果您想找到一种处理已经排序的值列表的方法:
IEnumerable<Car> query = numbers.OrderBy( q => q.Total );
跳过全0,然后取第一个元素:
var cheapest = query.SkipWhile(x => x == 0).First();