Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问日期时间列表时出错。“索引超出范围”或“不包含元素”_C# - Fatal编程技术网

C# 访问日期时间列表时出错。“索引超出范围”或“不包含元素”

C# 访问日期时间列表时出错。“索引超出范围”或“不包含元素”,c#,C#,我有一些麻烦,我真的不明白为什么,我似乎也找不到解决办法 我有一个日期时间值列表。我试图从列表中提取第一个和最后一个值,以便计算它们之间的总小时数。下面是显示如何生成列表的代码。代码的其余部分工作正常,因此我知道列表包含元素。问题出现在底部的5行代码中 列表日期列表=新列表; 列表距离列表=新列表; DateTime dateFromDb=新的日期时间; 字符串距离数据库; int distancesconter1=0; int distancesconter2=0; 双倍距离; 双倍就座率;

我有一些麻烦,我真的不明白为什么,我似乎也找不到解决办法

我有一个日期时间值列表。我试图从列表中提取第一个和最后一个值,以便计算它们之间的总小时数。下面是显示如何生成列表的代码。代码的其余部分工作正常,因此我知道列表包含元素。问题出现在底部的5行代码中

列表日期列表=新列表; 列表距离列表=新列表; DateTime dateFromDb=新的日期时间; 字符串距离数据库; int distancesconter1=0; int distancesconter2=0; 双倍距离; 双倍就座率; 双重标准百分比; SqlDataReader; dbConnection.Open; 使用SqlCommand selectCmd= 新SqlCommandSELECT*来自测量值,其中DateTime介于@fromTime和@now之间,按DateTime DESC排序,dbConnection { 选择cmd.Parameters.AddWithValuenow,now; 选择cmd.Parameters.AddWithValuefromTime,fromTime; reader=选择cmd.ExecuteReader; 边读边读 { dateFromDb=reader.GetDateTimereader.GetOrdinalDateTime; distanceFromDb=reader.GetStringreader.GetOrdinaldInstance; datesList.AdddateFromDb; distancesList.AdddistanceFromDb; } 读者。关闭; dbConnection.Close; } 距离列表中的foreach var dist { 如果Convert.ToInt16dist列表中的项目从0到计数-1进行编号

因此,要访问最后一项,不要使用datesList[datesList.Count],而是使用datesList[datesList.Count-1]

您的代码应该始终准备好处理空列表。因此,在尝试访问列表内容之前,首先检查列表是否为空

TimeSpan totalHours = new TimeSpan();

if (datesList.Any())
{

    DateTime time1 = datesList.First();
    DateTime time2 = datesList.Last();
    totalHours = time1 - time2;
}
else
{
    totalHours = TimeSpan.Zero;
}

从调试器开始的好地方。错误表明datelist没有任何内容,所以请检查sql语句发生了什么。此行DateTime time2=datesList[datesList.Count];应该是DateTime time2=datesList[datesList.Count-1];因此,我知道列表包含元素,您的代码说它不包含元素。无意冒犯,但我更信任代码=。我非常确定您的datesList没有元素,并且从DateTime到now ORDER BY DateTime DESCList之间的DateTime度量中选择*的结果是什么。这是一个事实。如果列表包含任何项目,则列表[0]有效。这是事实。日期列表[日期列表.计数]不起作用。这也是一个事实。datesList.Count-0等于datesList.Count。发生错误时,您应该检查调试器中的实际值,以查看实际抛出的行以及其中实际包含多少项。感谢您回答@NineBerry。错误发生在尝试获取列表中的第一个值时。@DanielBeck,是这样做的运行NineBerry答案中显示的代码时会出现错误?@RoadWarrior no现在可以工作了。我想知道,为什么代码可以使用这个分支语句,因为它所做的只是检查列表是否包含任何元素?列表不应该包含有或没有检查的元素吗?@DanielBeck我怀疑代码在您执行应用程序时多次执行。在某些情况下,列表为空,在某些情况下,它包含元素。您可以通过设置断点轻松找到。
foreach (var date in datesList)
        {
            listBox1.Items.Add(date);
        }


        //TimeSpan totalHours = new TimeSpan();
        //DateTime time1 = datesList.First();
        //DateTime time2 = datesList.Last();
        //totalHours = time1 - time2;
        //textBoxTime.Text = totalHours.TotalHours.ToString();
TimeSpan totalHours = new TimeSpan();

if (datesList.Any())
{

    DateTime time1 = datesList.First();
    DateTime time2 = datesList.Last();
    totalHours = time1 - time2;
}
else
{
    totalHours = TimeSpan.Zero;
}