C#在处理列表时给出NullReferenceException

本文关键字:NullReferenceException 列表 处理 | 更新日期: 2023-09-27 17:58:33

以下代码在处理时给出NullReferenceException。有人能告诉我为什么会发生这种情况,以及如何解决吗?提前感谢!这可能是一件很简单的事情,我在某个地方失踪了。

if (a.Count != 0)
 {
foreach(DataGridViewRow row in a )
{
  foreach (DataGridViewRow newrow in b)
     {
        if( row.Cells[0].Value.ToString() == newrow.Cells[0].Value.ToString() &&
            row.Cells[1].Value.ToString() == newrow.Cells[1].Value.ToString()) // this is the line that gives the error.
            {
                      a.Remove(row);
            }
          }
     }
}

这两个列表是在类的顶部声明的,所以我不知道为什么会出现这个错误。

 List<DataGridViewRow> a = new List<DataGridViewRow>();
 List<DataGridViewRow> b = new List<DataGridViewRow>();

正如建议的那样,我尝试使用for循环位,它仍然给出相同的异常

这是代码

if (a.Count != 0)
        {
            for (int i = a.Count - 1; i >= 0; i--)
            {
                int index1 = i;

                for (int k = 0; k < b.Count; k++)
                {
                    int index2 = k;
                    if (a.ElementAt<DataGridViewRow> (index1).Cells[0].Value.ToString() == b.ElementAt<DataGridViewRow>(index2).Cells[0].Value.ToString() && a.ElementAt<DataGridViewRow>(index1).Cells[1].Value.ToString() == b.ElementAt<DataGridViewRow>(index2).Cells[1].Value.ToString())
                    {
                        a.RemoveAt(index1);
                    }
                    else continue;
                }
            }

C#在处理列表时给出NullReferenceException

若要查找空指针异常,请使用调试器。您的一个变量为null。

但一旦解决了这个问题,在对列表进行迭代时就不能修改它。在您提供的代码中,最简单的解决方案是将foreach循环更改为for循环。

来自foreach:的MSDN文档

foreach语句为数组或对象集合中的每个元素重复一组嵌入语句。foreach语句用于遍历集合以获得所需信息,,但不应用于更改集合的内容以避免不可预测的副作用

您可能有一个null Value,所以ToString()会失败。

几种可能性:

  • row.Cells[0]为空
  • row.Cells[1]为空
  • row.Cells[0].Value为空
  • row.Cells[1].Value为空

不能从正在迭代的集合中删除元素。解决方案是将要删除的元素列表存储在另一个列表中,然后在另一次迭代中删除它们。以下是一个解决方案。

    //New list that will contain the Objects to be deleted later on.
    List<DataGridView> listToDelete = new List<DataGridView>();
    if (a.Count != 0)
    {
        foreach(DataGridViewRow row in a )
        {
            foreach (DataGridViewRow newrow in b)
            {
                if( row.Cells[0].Value.ToString() == newrow.Cells[0].Value.ToString() &&
                row.Cells[1].Value.ToString() == newrow.Cells[1].Value.ToString())
                {
                    listToDelete.Add(row);
                }
            }
        }
    }
    foreach (DataGridView d in listToDelete) {
        a.Remove(d);
    }