用foreach代替for的可能方法

时间:2018-08-30 19:49:33

标签: c# winforms arraylist

我正在尝试将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();
}

4 个答案:

答案 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;
}