是否有更简单的方法来反转DataGridViewSelectedRowCollection的顺序?

时间:2015-09-03 15:42:07

标签: c# winforms collections datagridview

出于某种奇怪的原因,sudo vim $SPARK_HOME/conf/spark-defaults.conf #uncomment the spark.driver.memory and change it according to your use. I changed it to below spark.driver.memory 15g # press : and then wq! to exit vim editor 的填充顺序与DataGridViewSelectedRowCollection中显示的顺序相反。但更令人费解的是,为什么没有一种直接的方法来反转在DataGridView循环中使用的顺序。

我希望能够使用如此简单的语法:

foreach

...但当然,这不受支持。*

所以,目前我正在使用这个怪物:

foreach (DataGridViewRow r in dataGridView1.SelectedRows.Reverse())

......这非常丑陋和令人费解。 (我意识到我可以使用反向//reverse the default selection order: IEnumerable<DataGridViewRow> properlyOrderedSelectedRows = dataGridView1.SelectedRows.Cast<DataGridViewRow>().ToArray().Reverse(); foreach (DataGridViewRow r in properlyOrderedSelectedRows ) { MessageBox.Show( r.Cells["ID"].Value.ToString()); } 循环,但我更喜欢For的可读性。)

我在这里缺少什么?有更简单的方法吗?

* 实际上,根据discussion hereforeach implements IEnumerable,我希望这个版本能够正常运行。但它没有编译。

3 个答案:

答案 0 :(得分:2)

我认为你只需要为你的每个循环投射:

  foreach (DataGridViewRow row in dataGridView1.SelectedRows.Cast<DataGridViewRow>().Reverse()) {

  }

然而,即使它看起来代码较少也没有那么高效,因为它必须基本上通过枚举器转发将所有内容放在堆栈上,然后以相反的顺序将所有内容弹出。

如果你有一个可直接索引的集合,你肯定应该使用for循环,并以相反的顺序枚举集合。

如此处Possible to iterate backwards through a foreach?

所述

答案 1 :(得分:1)

您可以将行添加到堆栈中......

stack<DataGridViewRow> properlyOrderedSelectedRows  = new stack<DataGridViewRow>(dataGridView1.SelectedRows);

foreach (DataGridViewRow r in properlyOrderedSelectedRows )
{
    MessageBox.Show( r.Cells["ID"].Value.ToString());
}

Stack<T>有一个constructor,可以接受IEnumerable<T>

答案 2 :(得分:1)

  

但更令人费解的是,为什么没有一种简单的方法来反转在foreach循环中使用的顺序。

     

我希望能够使用如此简单的语法:
  ...
  ......但当然,这不受支持。*

如何让它自己工作而不是所有这些伪诙谐的陈述,&#34; monstrosities&#34;和非常低效的LINQ-es。您所需要的只是在一些常见的地方写一个单行功能。

public static IEnumerable<DataGridViewRow> GetSelectedRows(this DataGridView source)
{
    for (int i = source.SelectedRows.Count - 1; i >= 0; i--)
        yield return source.SelectedRows[i];
}