在C#中的列表中查找最后一个Non Null元素的位置

时间:2017-07-06 15:47:41

标签: c#

我的MySQL数据库中有以下值

Date        High_Low_Price
5/18/2017   302
5/19/2017   315.3
5/22/2017   Null
5/23/2017   Null
5/24/2017   Null
5/25/2017   Null
5/26/2017   Null
5/29/2017   Null

我已经用以下格式创建了一个列表

List<db1> StockData = new List<db1>(); 
db1 newStock = new db1();
newStock.High_Low_Price = (double)reader["High_Low_Price"];
StockData.Add(newStock);

如何在列表中找到最后一个非null元素(即i)的位置。当我指的是最后一个元素时,我在2017年5月19日引用了High_Low_Price的315.3。

High_Low_Price列中的Null值将保持不变。那我怎么能找到这个列表中有值的最后一个日期呢?

编辑:我需要两件事,即日期和职位。

6 个答案:

答案 0 :(得分:1)

var date = StockData.Where(lst=>lst.High_Low_Price!=null).OrderByDescending(lst=>lst.Date).FirstOrDefault().Date;

答案 1 :(得分:1)

怎么样

var row = StockData.OrderByDescending(x => x.Date)
                   .FirstOrDefault(x => x.High_Low_Price.HasValue);

if (row != null) // In case above query don't return anything 
                 // cause all rows have blank High_Low_Price 
{
    var result = row.ModifiedDate;
}

答案 2 :(得分:1)

int position = StockData.IndexOf(
              StockData.Where(lst=>lst.High_Low_Price!=null).OrderByDesc(lst=>lst.Date).FirstOrDefault()
            );

var lastDate = StockData[position]?.Date;

答案 3 :(得分:1)

假设您的数据已经从原始数据库查询开始按顺序排列:

var idx = StockData.Select((data,idx) => new { data, idx})
                   .Where(x => x.data.High_Low_Price != null).FirstOrDefault()?.i;

答案 4 :(得分:1)

假设High_Low_Price的类型可以为空,例如&#39; double?&#39;

var lastDate = StockData.Last(x => x.High_Low_Price.HasValue).Date;

答案 5 :(得分:1)

由于你在一篇评论中提到Null值总是在列表的末尾,然后假设是这种情况,因为你只想要元素的位置及其日期,一个天真的方法来解决这个问题就是做

        var i = 0;
        var pos = 0;
        DateTime? date = null;
        while (i < StockData.Count && StockData.ElementAt(i)?.High_Low_Price != null )
        {
            pos = i;
            date = StockData.ElementAt(i).Date;
            i++;
        }