C# 有没有更简单的方法来反转DataGridViewSelectedRowCollection的顺序?

C# 有没有更简单的方法来反转DataGridViewSelectedRowCollection的顺序?,c#,winforms,collections,datagridview,C#,Winforms,Collections,Datagridview,出于某种奇怪的原因,DataGridView selectedrowcollection按与DataGridView中显示的相反顺序填充。但更令人费解的是,为什么没有一种简单的方法来颠倒foreach循环中的使用顺序 我希望能够使用如下简单的语法: foreach (DataGridViewRow r in dataGridView1.SelectedRows.Reverse()) ……但当然,这是不受支持的* 所以,目前我正在使用这个怪物: //reverse the default sel

出于某种奇怪的原因,
DataGridView selectedrowcollection
按与
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());
}
//反转默认选择顺序:
IEnumerable PropertyOrderedSelectedRows
=dataGridView1.SelectedRows.Cast().ToArray().Reverse();
foreach(PropertyOrderedSelectedRows中的DataGridViewRow r)
{
Show(r.Cells[“ID”].Value.ToString());
}
…这是非常丑陋和复杂的。(我意识到我可以使用反向
进行
循环,但我更喜欢
foreach
的可读性。)

我错过了什么?有没有更简单的方法


*事实上,我本来希望这个版本能够正常工作,因为
DataGridViewSelectedRowCollection
;但它无法编译。

我认为您只需要在for-each循环中进行转换,如:

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

  }
foreach(dataGridView1.SelectedRows.Cast().Reverse()中的DataGridViewRow行){
}
然而,这并没有那么有效,即使它看起来代码更少,因为它基本上必须通过枚举器将所有内容放在堆栈上,然后以相反的顺序将所有内容弹出

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


正如这里提到的,我认为您只需要在for each循环中进行如下转换:

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

  }
foreach(dataGridView1.SelectedRows.Cast().Reverse()中的DataGridViewRow行){
}
然而,这并没有那么有效,即使它看起来代码更少,因为它基本上必须通过枚举器将所有内容放在堆栈上,然后以相反的顺序将所有内容弹出

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


正如这里提到的,您可以将行添加到堆栈中

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

foreach (DataGridViewRow r in properlyOrderedSelectedRows )
{
    MessageBox.Show( r.Cells["ID"].Value.ToString());
}
stack PropertyOrderedSelectedRows=新堆栈(dataGridView1.SelectedRows);
foreach(PropertyOrderedSelectedRows中的DataGridViewRow r)
{
Show(r.Cells[“ID”].Value.ToString());
}

Stack
有一个接受
IEnumerable

您可以将行添加到堆栈中

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

foreach (DataGridViewRow r in properlyOrderedSelectedRows )
{
    MessageBox.Show( r.Cells["ID"].Value.ToString());
}
stack PropertyOrderedSelectedRows=新堆栈(dataGridView1.SelectedRows);
foreach(PropertyOrderedSelectedRows中的DataGridViewRow r)
{
Show(r.Cells[“ID”].Value.ToString());
}
Stack
具有接受
IEnumerable

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

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

……但当然,这是不受支持的*

让它自己工作,而不是所有这些虚假的俏皮话,“怪物”和高度低效的LINQ。您所需要的只是在一些常见的地方编写一个线性函数

public static IEnumerable<DataGridViewRow> GetSelectedRows(this DataGridView source)
{
    for (int i = source.SelectedRows.Count - 1; i >= 0; i--)
        yield return source.SelectedRows[i];
}
公共静态IEnumerable GetSelectedRows(此DataGridView源代码)
{
对于(int i=source.SelectedRows.Count-1;i>=0;i--)
收益率返回源。选择收益率[i];
}
但更令人费解的是,为什么没有一种简单的方法来反转foreach循环中的使用顺序

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

……但当然,这是不受支持的*

让它自己工作,而不是所有这些虚假的俏皮话,“怪物”和高度低效的LINQ。您所需要的只是在一些常见的地方编写一个线性函数

public static IEnumerable<DataGridViewRow> GetSelectedRows(this DataGridView source)
{
    for (int i = source.SelectedRows.Count - 1; i >= 0; i--)
        yield return source.SelectedRows[i];
}
公共静态IEnumerable GetSelectedRows(此DataGridView源代码)
{
对于(int i=source.SelectedRows.Count-1;i>=0;i--)
收益率返回源。选择收益率[i];
}

你能把它们按相反的顺序写出来吗?从数组的末尾到开始循环?避免同时反向调用?@SamPlusPlus:如上所述,我想使用
foreach
循环。在您的约束下(老实说,我不太清楚;就我个人而言,您的方法依赖于反向for循环),您的方法似乎很好(您可以通过删除properlyOrderedSelectedRows并在foreach循环中添加整个反转来减少代码的大小)。至少,假设SelectedRows始终以完全相反的顺序提供;否则,您将不得不依赖OrderBy行索引。您可以将它们以相反的顺序写出来吗?从数组的末尾循环到开始?避免调用一起反转?@SamPlusPlus:我想使用
foreach
循环,正如前面解释的那样在您的限制下(老实说,我不太清楚;就我个人而言,您的方法似乎很好(您可以通过删除properlyOrderedSelectedRows并在foreach循环中添加整个反转来减少代码的大小)。至少,假设SelectedRow总是以完全相反的顺序提供;否则,您将不得不依赖OrderBy行索引。我知道效率的权衡,但我并不十分担心。这是一个SelectedRow集合,当用户选择很多行时,这将是罕见的。但您确实缩小了我的索引链方法至少是一行,所以你赢得了奖。谢谢。我知道效率的权衡,但我并不十分关心。这是一个SelectedRowCollection,当用户选择了很多行时,这将是罕见的。但是你确实将我的方法链缩小了一行,至少,所以你赢得了奖。谢谢。好吧,这就是