【问题标题】:Possible way to do to with foreach instead of for [closed]使用 foreach 而不是 for [关闭] 的可能方法
【发布时间】:2019-02-05 19:58:56
【问题描述】:

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

【问题讨论】:

  • foreach 展示你的尝试并解释它有什么问题。
  • 顺便说一句,该示例中的代码是错误的。 DataGridView Row row中存在语法错误
  • 您在哪里/如何删除行?使用foreach 枚举(即dataGridView2.Rows 不能更改,顺便说一句
  • “使用这个 for 方法,我的问题是,当我从 datagridview 中删除一堆行时,它会出错,或者我的二进制搜索无法正常工作。” i> - 所以这是你的实际问题。你得到什么错误?
  • 这些答案都没有帮助,但我解决了我的问题。我删除了ArrayList.sort(); 并改用ArrayList.ToArray();。现在它完美地工作了!

标签: c# winforms arraylist


【解决方案1】:

作为循环的替代方案,您可以在 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();

【讨论】:

    【解决方案2】:

    为什么你不能将foreach 用于任何其他集合

        foreach (DataGridViewRow row in dataGridView2.Rows)
        { // code here 
        }
    

    【讨论】:

      【解决方案3】:

      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();
      

      【讨论】:

        【解决方案4】:

        您问题的老派答案(如何使用foreach 而不是for)与@Rahul 所描述的非常接近。然而,Rows 集合是一个前泛型集合(即,它从 .NET v1.x 开始就存在),当你对它进行 foreach 时,你得到的是对象,而不是行。相反,这是可行的:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-18
          • 2018-01-02
          • 2018-02-22
          • 2023-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多