使用linq查找列表中大于0的最便宜的项目

时间:2015-02-20 17:09:30

标签: c# linq

我面临排序列表的问题,我试图找到最便宜的价值。排序不是问题,它返回的值是问题和我想要满足的条件。

基本上我的结果集中可能有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上查看过这些问题会得出答案:

use LINQ to find the product with the cheapest value?

Get object with minimum value using extension method min()

3 个答案:

答案 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();