c# 检查 datagridview 列是否包含值 & linq First() vs FirstOrDefault()

Dat*_*ing 2 c# linq datagridview

我需要检查第一列是否DataGridView包含值 10

我用过这个

int index = -1;  
index = (dgv.Rows.Cast<DataGridViewRow>()  
        .Where(r => r.Cells[0].Value.Equals(10))  
        .Select(r => r.Index)).First();  
Run Code Online (Sandbox Code Playgroud)

但有时会产生错误:序列不包含元素

本论坛上有人建议使用FirstOrDefault()noFirst()

如果第一行中的第一列包含值 10 或者没有第一列包含值 10 的行,变量索引的值为 0,那这行得通

我的解决方案是:

try {
 index = (dgv.Rows.Cast<DataGridViewRow> ()
  .Where(r => r.Cells[0].Value.Equals(10))
  .Select(r => r.Index)).First();
} catch {
 index = -1
}
Run Code Online (Sandbox Code Playgroud)

此致,

Fab*_*bio 5

我需要检查 DataGridView 中的第一列是否包含值 10

该作业的正确工具(方法)将是.Anytrue如果集合中的任何项目满足给定条件,则返回,如果不满足或集合为空,则返回false。

if (dgv.Rows.Cast<DataGridViewRow>().Any(r => r.Cells[0].Value.Equals(10)))
{
    // exists
}  
else
{
    // not exist
}
Run Code Online (Sandbox Code Playgroud)

如果你真的需要一个索引值,.DefaultIfEmpty当集合为空或找不到所需值时,使用方法返回默认值。

var index = dgv.Rows.Cast<DataGridViewRow>()  
    .Where(r => r.Cells[0].Value.Equals(10))
    .Select(r => r.Index)
    .DefaultIfEmpty(-1)
    .First();
Run Code Online (Sandbox Code Playgroud)

有了.DefaultIfEmpty可以“告诉”你的代码的读者您的实际意图,无需额外条件或空传播者。
并且因为您在返回空集合的情况下提供了默认值,所以您可以安全地使用.First()方法,因为将始终返回至少一项。

要查找所有出现的给定值,请不要使用FirstFirstOrDefault