我正在尝试将DataGridView
列转换为ArrayList
。我想将此代码制作为foreach
版本。我尝试遵循this的答案,但是对我来说不起作用。使用这种for
方法时,我的问题是,当我从datagridview删除一堆行时,它给出了一个错误,或者我的二进制搜索无法正常工作。这就是为什么我想尝试使用foreach
方法的原因。
for (int i = 0 ; i < dataGridView2.Rows.Count; i++)
{
ListOfPeople[i] = dataGridView2.Rows[i].Cells[0].Value.ToString().Trim();
}
答案 0 :(得分:3)
作为循环的替代方法,您可以在 Linq 的帮助下尝试 query dataGridView2.Rows
并一次性构建ListOfPeople
:
// ArrayList is an obsolete class; let's use List<string>
List<string> ListOfPeople = dataGridView2
.Rows
.OfType<DataGridViewRow>()
.Select(row => row.Cells[0].Value.ToString().Trim())
.ToList();
答案 1 :(得分:0)
为什么您不能同样将foreach
用于其他任何收藏
foreach (DataGridViewRow row in dataGridView2.Rows)
{ // code here
}
答案 2 :(得分:0)
将for
转换为foreach
的问题是如何处理循环索引i
。有两种情况-当您需要i
和不需要i
时。
在需要i
时,请使用Select
将索引传递给您,如下所示:
foreach (var p in dataGridView2.Rows.Select((r, i) => new {Row = (DataGridViewRow)r, Index = i}) {
ListOfPeople[p.Index] = p.Row.Cells[0].Value.ToString().Trim();
}
如果不需要i
,则可以使用“直” foreach
,甚至可以完全放弃循环:
ListOfPeople = dataGridView2.Rows.Cast<DataGridViewRow>()
.Select(r => r.Cells[0].Value.ToString().Trim())
.ToList();
答案 3 :(得分:0)
您问题的老式答案(如何使用foreach
而不是for
)与@Rahul的描述非常接近。但是,Rows集合是一个通用集合(即从.NET v1.x开始就存在),当您对其进行遍历时,您将获得对象而不是行。相反,它可以工作:
foreach (var row in dataGridView2.Rows.Cast<DataGridViewRow>())
{ // code here
}
跟踪索引变量(i
)的传统方法是:
var i = 0;
foreach (var row in dataGridView2.Rows.Cast<DataGridViewRow>())
{
// your code here
++i;
}