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

问题描述 投票:0回答:7

我的 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 值的大小将保持变化。然后我如何找到此列表中具有值的最后一个日期?

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

c#
7个回答
1
投票

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

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

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

var lastDate = StockData[position]?.Date;

1
投票

假设 High_Low_Price 类型可为空,例如“double?”

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

1
投票

由于您在评论之一中提到空值始终位于列表的末尾,那么假设情况确实如此,并且由于您只想要元素的位置及其日期,解决此问题的简单方法就是这样做

        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++;
        }

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

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;
}

0
投票

在此解决方案中,我们转换为

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;
© www.soinside.com 2019 - 2024. All rights reserved.