首页 > 编程语言 >问文心一言——C# 遍历datagridview单元格 不用嵌套循环

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

时间:2024-05-09 15:27:09浏览次数:24  
标签:遍历 C# 单元格 cell 嵌套循环 Rows 文心 foreach row

问: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循环或扩展方法),要么是不推荐的做法(如使用递归)。在选择最佳方法时,请考虑代码的可读性、可维护性和性能。

标签:遍历,C#,单元格,cell,嵌套循环,Rows,文心,foreach,row
From: https://www.cnblogs.com/Jane-share/p/18182306

相关文章

  • 学习记录+vcode+GPIO例程+正点原子 DNESP32S3 开发板教程-IDF 版
    第一个程序:UART模式和JTAG模式,配置完成不同。配置主要就是.vscode文件夹中 c_cpp_properties.json,tasks.json,launch.json,settings.json四个文件。一个想法:备份UART模式和JTAG模式的配置文件,用时直接文件替换。简单粗暴方式是.vscode文件夹替换。当然每次要选好串口、设置目标......
  • redux中核心组件有哪些,reducer的作用
    在redux中,核心组件包括Action、Reducer、Store和Middleware。Action是一个普通的JavaScript对象,用于描述发生了什么事件。它必须包含一个type属性,用于标识事件的类型。可以在Action中添加其他自定义的属性来传递数据。Reducer是一个纯函数,用于根据收到的Action来更新应用的状态(S......
  • SqlFunc查询函数
    一、常用的C#函数支持一些常用的C#函数.ToString().Contains().Length().ToLower().ToUpper().ToSubstring().Equals().Replace().EndsWith().StartsWith().Trim().HasValue.Value.AddDays(AddHours等)和常用的Convert.ToInt32等三元xx??0时......
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线打开 word 文件
    PageOffice国产版:支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)芯片架构。在OA办公、文档流转等各个Web系统中,实现最简单的打开编辑保存文件功能,调用PageOffice只需要几行代码就可以完成。后端代码在后端编写代码调用webOpen方法......
  • C语言数据类型篇
    前言写这个系列的文章,其实也是给自己一个交代。之前断断续续的学过C语言,后来发现了很多自己的问题。比如看过的东西过几天就忘记了,有比如要坚持看多少东西后来就坚持不下去了,另外没有一个东西来记录自己对C语言的学习知识点的记录,C语言很重要。是所有语言的母语言,就想在此次学习......
  • 优化cmd中,查询表字段过长情况下的展示效果
    当我们遇到table字段比较多,cmd无法在一行内展示所有字段的情况时可以切换查询语句的结束格式:由以分号;结尾select*fromtable;切换为以/G结尾select*fromtable/G可以切换table的展示格式为以竖列的形式展示一行一行的数据......
  • 对于Docker和Podman的一点使用经验
    前言:本文会以多个实际的线上例子,分享自己对于Docker和Podman的一点使用经验及踩过的坑,希望对读者有一点帮助。本文bash脚本初步加工后可直接使用(兼容mac和linux系统),对于关键点会有注重说明,但是对于一些细节需要读者自行去查阅相关文档,这里不会具体展开。一、部署Apollo1、docke......
  • Node.js证件OCR、身份证实名认证接口、身份证识别API
    身份证是证明公民身份的有效证件,一些不法分子可以通过简单的工序制作出假身份证,损害老百姓的合法利益。据警方统计,大部分预谋诈骗犯罪分子会使用假身份证件,而社会上也有一部分人出于不正当的目的,刻意隐瞒自己真实的身份信息。在这种前提下,“全国身份证联网核查”应运而生,它的......
  • PVE删除 local-lvm合并至 local分区
    1、备份PVE中的所有虚拟机2、删除所有虚拟机3、删除local-lvm分区lvremovepve/data 4、把local-lvm空间合并给local分区lvextend-rl+100%FREEpve/rootresize2fs/dev/mapper/pve-root 5、删除local-lvm网页登录,数据中心---存储---移除local-lvm分......
  • BOSHIDA AC/DC电源模块在通信与网络设备中的应用研究
    BOSHIDAAC/DC电源模块在通信与网络设备中的应用研究随着通信与网络技术的不断发展,通信与网络设备的使用不断增加。电源作为通信与网络设备的重要组成部分之一,在其稳定工作中起到至关重要的作用。AC/DC电源模块作为一种常用的电源转换器,广泛应用于通信与网络设备中。 一,AC/DC......