问文心一言——C# 遍历datagridview单元格 不用嵌套循环

问:C# 遍历datagridview单元格 不用嵌套循环
答:
在C#中遍历DataGridView的单元格通常意味着你需要遍历行(Rows)并在每行中遍历单元格(Cells)。然而,如果你想要避免嵌套循环的“感觉”,你可以使用LINQ(Language Integrated Query)或者一个简单的foreach循环配合委托或Lambda表达式来“扁平化”这个操作。

不过,需要注意的是,从逻辑上讲,你仍然需要遍历行和单元格,只是代码结构可能看起来不同。

以下是一个使用foreach循环遍历DataGridView中所有单元格的示例,没有显式的嵌套循环:

遍历单元格代码
foreach (DataGridViewRow row in dataGridView1.Rows)  
{  
    foreach (DataGridViewCell cell in row.Cells)  
    {  
        // 访问单元格的值,例如:  
        object cellValue = cell.Value;  
        // 在这里可以对cellValue进行任何你需要的操作  
        // ...  
    }  
}
但如果你想要一个稍微不同的结构,你可以使用LINQ的SelectMany方法来“扁平化”这个操作:
SelectMany方法代码
var allCells = dataGridView1.Rows.Cast<DataGridViewRow>()  
    .SelectMany(row => row.Cells.Cast<DataGridViewCell>());  
  
foreach (DataGridViewCell cell in allCells)  
{  
    // 访问单元格的值,例如:  
    object cellValue = cell.Value;  
    // 在这里可以对cellValue进行任何你需要的操作  
    // ...  
}
在这个例子中,Cast()和Cast()是用来确保集合中的元素被正确地转型为期望的类型(因为Rows和Cells都是非泛型集合)。然后,SelectMany将每一行的所有单元格“展平”成一个单一的IEnumerable集合,这样你就可以用一个简单的foreach循环来遍历所有单元格了。

问:还有其他方法吗
答:
除了上面提到的使用foreach循环和LINQ的SelectMany方法之外,确实还有其他方法可以遍历DataGridView的单元格,但本质上都是基于迭代行和单元格的。不过,这里有一些不同的写法,可能会使代码看起来更简洁或更易于阅读。

方法 1:使用 for 循环
使用for循环可以避免显式的foreach,但仍然是嵌套迭代:

for循环代码
for (int i = 0; i < dataGridView1.Rows.Count; i++)  
{  
    DataGridViewRow row = dataGridView1.Rows[i];  
    for (int j = 0; j < row.Cells.Count; j++)  
    {  
        DataGridViewCell cell = row.Cells[j];  
        // 访问单元格的值  
        object cellValue = cell.Value;  
        // ...  
    }  
}
方法 2:使用扩展方法(自定义) 你可以创建一个扩展方法来遍历DataGridView的单元格,这样可以使代码更加模块化和可重用:
扩展方法代码
Action<DataGridViewCell> cellAction = cell =>  
{  
    // 访问单元格的值  
    object cellValue = cell.Value;  
    // ...  
};  
  
foreach (DataGridViewRow row in dataGridView1.Rows)  
{  
    row.Cells.Cast<DataGridViewCell>().ToList().ForEach(cellAction);  
}
方法 3:使用委托和Lambda表达式(与扩展方法类似) 如果你不想创建扩展方法,但想使用类似的功能,你可以直接使用委托和Lambda表达式:
委托和Lambda表达式方法
Action<DataGridViewCell> cellAction = cell =>  
{  
    // 访问单元格的值  
    object cellValue = cell.Value;  
    // ...  
};  
  
foreach (DataGridViewRow row in dataGridView1.Rows)  
{  
    row.Cells.Cast<DataGridViewCell>().ToList().ForEach(cellAction);  
}
注意这里使用了ToList().ForEach()来应用委托到每个单元格,但这实际上在内部还是使用了循环,并且引入了额外的ToList()调用,这可能不是性能最优的。

方法 4:使用递归(不推荐)
虽然理论上你可以使用递归来遍历单元格,但这并不是一个好的做法,因为它会使代码变得复杂且难以维护,而且性能上也不如迭代方法。不过,这里是一个简单的示例来说明概念:

递归方法
void IterateCellsRecursive(DataGridView dataGridView, int rowIndex = 0)  
{  
    if (rowIndex >= dataGridView.Rows.Count) return;  
  
    DataGridViewRow row = dataGridView.Rows[rowIndex];  
    foreach (DataGridViewCell cell in row.Cells)  
    {  
        // 访问单元格的值  
        object cellValue = cell.Value;  
        // ...  
    }  
  
    IterateCellsRecursive(dataGridView, rowIndex + 1);  
}  
  
// 使用方法:  
IterateCellsRecursive(dataGridView1);
尽管有多种方法可以遍历DataGridView的单元格,但最常用和推荐的方法是使用嵌套的foreach循环或LINQ的SelectMany。其他方法要么是语义上的等价物(如使用for循环或扩展方法),要么是不推荐的做法(如使用递归)。在选择最佳方法时,请考虑代码的可读性、可维护性和性能。
posted @   橘子Jane  阅读(289)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示