C# 查询数据表中同一行上的特定值

C# 查询数据表中同一行上的特定值,c#,asp.net,winforms,datagridview,C#,Asp.net,Winforms,Datagridview,目标:我想查询datagridview上的所有行,并检查同一行上的两列是否等于特定值。我得到一个“objectreference等于null”错误,因为我使用的是foreach循环。执行此任务的最佳方式是什么?以身作则 当前代码: foreach (DataGridViewRow row in dataTABLE.Rows) { if ((row.Cells[0].Value.

目标:我想查询datagridview上的所有行,并检查同一行上的两列是否等于特定值。我得到一个“objectreference等于null”错误,因为我使用的是foreach循环。执行此任务的最佳方式是什么?以身作则

当前代码:

foreach (DataGridViewRow row in dataTABLE.Rows)
{                                                            
if ((row.Cells[0].Value.ToString().ToUpper().Equals(MyServerChecked)) & (row.Cells[1].Value.ToString().ToUpper().Equals(service.ServiceName.ToString().ToUpper())))
}

单击按钮时,值会写入数据表。在该按钮内,存在这个foreach循环,因为我不希望多次创建同一行。这就是为什么我试图查询列值并比较它们的原因,foreach

foreach
与空引用异常无关,除非您在处理某些行时删除它们。您没有提供有关哪个对象发生错误的任何信息,但如果方法为null,则无法调用
行.Cells[0]。Value
行.Cells[0]。Value
ToString()
方法。 您可以在if语句中添加其他条件:

if(row.Cells[0].Value!=null && row.Cells[1].Value!=null
    && row.Cells[0].Value.ToString().ToUpper().Equals(MyServerChecked)
    & row.Cells[1].Value.ToString().ToUpper().Equals(service.ServiceName.ToString().ToUpper()))

为了避免异常,在尝试调用对象上的方法之前,首先检查对象是否不为null。检查

dataTABLE != null
Cells[0].Value != null
Cells[1].Value != null
话虽如此,您询问了实现该任务的最佳方法,因此这里还有一些其他问题需要考虑

您可以使用类似于
dataTable.AsEnumerable().Any(dr=>…)的东西在数据表中进行迭代
查看是否已经存在与条件匹配的行

每当您需要将字符串与其他可能为空的字符串或对象进行比较时,您都需要仔细考虑您的要求以及空引用对您的意义

如果
单元格[0]。值==null
是否仍要继续并比较
MyServerChecked
?如果
单元格[0].value==null
MyServerChecked==null
那么它们应该被视为相等吗

类似地,您希望如何处理空字符串?空字符串是否应被视为等于null

下面是一个简单的解决方案。如果单元格为空,则不会尝试比较它们。这可能不是您想要的行为,但正如我所说的,请思考一下空值和空字符串对于特定场景的意义,并相应地编写代码

string MyServerChecked = "Something";
string ServiceName = service.ServiceName.ToString();

if (dataTable != null)
{
    foreach (DataGridViewRow row in dataTable.Rows)
    {
        if (row.Cells[0].Value != null
            && row.Cells[1].Value != null
            && string.Equals(row.Cells[0].Value.ToString(), MyServerChecked, StringComparison.OrdinalIgnoreCase)
            && string.Equals(row.Cells[1].Value.ToString(), ServiceName, StringComparison.OrdinalIgnoreCase))
        {
            // Row already exists...
        }
    }
}
将重载的
string.Equals
方法与
StringComparison
enum类型一起使用意味着您不必自己转换为上限。它还为区域性设置提供了一些额外的选项。有关更多信息,请查看MSDN

你说的“在把它们写到桌子上之前”是什么意思?您正在通过dataTABLE.Rows集合进行初始化。如果您需要对所有行设置一些条件,您可以在
dataTable.rows.Where(一些lambda条件)
上迭代。您也可以对其使用
独特的
扩展方法。您没有提供任何检查行是否重复的代码,只是一个条件。另外-调用
service.ServiceName.ToString()
无效-为什么每次迭代都要处理字符串?