我正在尝试从DataGridView
中选择多行,而不是使用for-each循环进行迭代。
我可以使用以下代码选择1个项目:
DataGridViewRow row2 =
(from DataGridViewRow r in dgView.Rows
where r.Cells["name"].Value.ToString().Equals("Akins Ford")select r).FirstOrDefault();
但是当我尝试选择多行时,请使用以下代码:
List<DataGridViewRow> rows2 =
(from DataGridViewRow r in dgView.Rows
where r.Cells["status"].Value.ToString().Equals("active")select r);
我收到了一个错误:
错误2无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.List'。存在显式转换(您是否缺少演员?)C:\ Software \ Json \ Json \ Form1.cs 188 18 Json
答案 0 :(得分:3)
您需要对结果进行简单的包装:
List<DataGridViewRow> rows2 =
new List<DataGridViewRow>
(from DataGridViewRow r in dgView.Rows
where r.Cells["status"].Value.ToString().Equals("active")
select r);
这是因为linq代码返回IEnumerable<T>
而不是List<T>
。但您可以通过调用相应的构造函数从List<T>
创建IEnumerable<T>
:
var list = new List<T>(iEnumerable);
为了防止空引用异常,您可能希望进一步改进代码:
List<DataGridViewRow> rows2 =
new List<DataGridViewRow>
(from DataGridViewRow r in dgView.Rows
where r.Cells["status"]?.Value.ToString().Equals("active")??false
select r);
我假设你正在使用允许空传播的VS2015
r.Cells["status"]?.Value.ToString().Equals("active")??false
把'?'在Cells["status"]
确保任何空引用导致null之后。然后最后的??false
说,如果我们有一个null,我们返回false(即不包括这一行)。