正确的方法来检查DateTime是否大于另一个DateTime

时间:2019-08-06 06:47:37

标签: c# datetime for-loop

我想检查CustomFormat中的DateTime是否大于另一个DateTime,但是在代码删除了很多项目之后,检查仍然可以。这是我的代码。这项工作是删除所有3天以上的ListViewItem。

for (int i = 0; i < lvValid.Items.Count; i++)
{
    if (DateTime.Now.AddDays(-3) > DateTime.Parse(lvValid.Items[i].SubItems[1].Text))
    {
        lvValid.Items[i].Remove();
    }
}

我已经尝试过foreach,但是没有帮助。并删除了第二个元素,但不正确

3 个答案:

答案 0 :(得分:2)

正向循环的一个大问题是,如果删除一项,则其余项的索引将向左移动。因此,在i == 1处,下一项将在移除后的1处。然后i将递增,并跳过前一个下一个项目。

我建议使用反向循环:

for (int i = lvValid.Items.Count - 1; i >= 0 ; i--)
{
    if (DateTime.Now.AddDays(-3) > DateTime.Parse(lvValid.Items[i].SubItems[1].Text))
    {
        lvValid.Items[i].Remove();
    }
}

我个人建议使用原始数据。首先根据您的条件过滤数据,然后重新填充ListView

答案 1 :(得分:1)

也许您应该反转循环,而不要使用.AddDays(-3)

for (int i = lvValid.Items.Count - 1; i >= 0; i--)
{
    if (DateTime.Now <= DateTime.Parse(lvValid.Items[i].SubItems[1].Text).AddDays(3);
    {
        lvValid.Items[i].Remove();
    }
}

答案 2 :(得分:1)

如果要使用 forward 循环(如果要删除的顺序很重要),则在不删除项目时应增加i++

// we don't want redrawing on each removing (i.e. lvValid blicking)
lvValid.BeginUpdate();

try 
{
    for (int i = 0; i < lvValid.Items.Count; ) // don't icrement i here... 
        if (DateTime.Now.AddDays(-3) > DateTime.Parse(lvValid.Items[i].SubItems[1].Text))
            lvValid.Items[i].Remove();
        else 
            ++i; // ... but there
}
finally 
{
    // when finisihing removing, redraw lvValid if required 
    lvValid.EndUpdate();
}