使用LINQ获取DataGridView行索引,其中第一列具有特定值

jac*_*obz 6 c# linq datagridview

我想得到DataGridViewRow的索引,其第一列的值匹配.

我的代码到目前为止:

string SearchForThis = "test";

int index = from r in dgv.Rows
            where r.Cells[0].Value == SearchForThis
            select r.Index;
Run Code Online (Sandbox Code Playgroud)

编译错误:

找不到源类型'System.Windows.Forms.DataGridViewRowCollection'的查询模式的实现.'哪里'找不到.考虑明确指定范围变量'r'的类型.

Hab*_*bib 10

DataGridViewRowCollection没有实现IEnumerable<T>,这就是为什么你不能使用LINQ,使用Enumerable.Cast方法.

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

或者使用查询语法:

int index = (from r in dgv.Rows.Cast<DataGridViewRow>()
            where r.Cells[0].Value == SearchForThis
            select r.Index).First();
Run Code Online (Sandbox Code Playgroud)

您需要从集合中获取单个结果,这就是我使用过的原因First,但请记住,如果没有符合条件的项目,它将引发异常.为了克服这个问题,请在答案结束时看到解决方案.

看到: Enumerable.Cast<TResult> Method

Cast<TResult>(IEnumerable)方法允许通过提供必要的类型信息在非泛型集合上调用标准查询运算符.例如,ArrayList没有实现IEnumerable<T>,但是通过调用 Cast<TResult>(IEnumerable)ArrayList对象,然后可以使用标准查询运算符来查询序列.

(你也可以使用Enumerable.OfType方法,这将忽略所有那些不是DataGridViewRow,但有DataGridView,Cast也很好)

您还可以使用FirstOrDefault先获取行,然后获取索引,如:

int index = 0;
var item = dgv.Rows.Cast<DataGridViewRow>()
                    .FirstOrDefault(r => r.Cells[0].Value == (object)1);
if (item != null)
    index = item.Index;
Run Code Online (Sandbox Code Playgroud)