我的 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);
如何找到列表中最后一个非空元素(即 i)的位置。当我指的是最后一个元素时,我指的是 2017 年 5 月 19 日的 High_Low_Price 的 315.3。
High_Low_Price 列中的 Null 值的大小将保持变化。然后我如何找到此列表中具有值的最后一个日期?
编辑:我需要两件事,日期和位置。
假设您的数据已经按照原始数据库查询的顺序排列:
var idx = StockData.Select((data,idx) => new { data, idx})
.Where(x => x.data.High_Low_Price != null).FirstOrDefault()?.i;
int position = StockData.IndexOf(
StockData.Where(lst=>lst.High_Low_Price!=null).OrderByDesc(lst=>lst.Date).FirstOrDefault()
);
var lastDate = StockData[position]?.Date;
假设 High_Low_Price 类型可为空,例如“double?”
var lastDate = StockData.Last(x => x.High_Low_Price.HasValue).Date;
由于您在评论之一中提到空值始终位于列表的末尾,那么假设情况确实如此,并且由于您只想要元素的位置及其日期,解决此问题的简单方法就是这样做
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++;
}
var date = StockData.Where(lst=>lst.High_Low_Price!=null).OrderByDescending(lst=>lst.Date).FirstOrDefault().Date;
怎么样
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;
}
在此解决方案中,我们转换为
true
/false
布尔值列表。接下来,我们确定最后出现的 true
的索引。一旦我们有了这个索引,我们就可以检索日期。
int lastIndex = StockData.Select(x => x["High_Low_Price"] is not null)
.ToList<bool>()
.LastIndexOf(true);
var lastDate = lastIndex != -1 ? StockData[lastIndex].Date : null;