一、迭代器模式:IEnumerable与IEnumerator接口详解
1.1 迭代器设计原理
在.NET框架中,迭代器模式通过IEnumerable和IEnumerator接口实现集合元素的遍历。这种设计将数据存储与遍历逻辑解耦,开发者只需实现标准接口即可创建自定义可迭代对象。
IEnumerable接口定义了获取迭代器的标准方法:
public interface IEnumerable{IEnumerator GetEnumerator();}
而IEnumerator接口则包含三个核心成员:
Current属性:获取当前元素MoveNext()方法:推进迭代器到下一个位置Reset()方法:重置迭代器状态(已过时,不推荐使用)
1.2 迭代器实现模式
1.2.1 显式实现方式
通过手动实现接口创建迭代器:
public class NumberRange : IEnumerable{private int _start;private int _end;public NumberRange(int start, int end){_start = start;_end = end;}public IEnumerator GetEnumerator(){return new NumberRangeEnumerator(_start, _end);}private class NumberRangeEnumerator : IEnumerator{private int _current;private int _end;public NumberRangeEnumerator(int start, int end){_current = start - 1;_end = end;}public object Current => _current;public bool MoveNext(){if (_current >= _end) return false;_current++;return true;}}}
1.2.2 编译器生成方式
使用yield return语法糖自动生成迭代器:
public class NumberRange : IEnumerable{private int _start;private int _end;public NumberRange(int start, int end){_start = start;_end = end;}public IEnumerator GetEnumerator(){for (int i = _start; i <= _end; i++){yield return i;}}}
编译器会将此类代码转换为状态机实现,包含完整的迭代器逻辑。
1.3 泛型迭代器优化
.NET 2.0引入的泛型接口IEnumerable<T>和IEnumerator<T>消除了类型转换开销:
public interface IEnumerable<out T> : IEnumerable{new IEnumerator<T> GetEnumerator();}public interface IEnumerator<out T> : IDisposable, IEnumerator{new T Current { get; }}
二、文档处理:NPOI库实战指南
2.1 文档处理技术选型
处理Word文档时,开发者面临多种技术方案选择:
- COM互操作:通过
Microsoft.Office.Interop.Word调用本地Office组件,仅适用于Windows桌面环境 - OpenXML SDK:直接操作Office Open XML格式,学习曲线陡峭
- NPOI库:跨平台解决方案,支持.NET Standard 2.0+
2.2 NPOI核心功能实现
2.2.1 环境准备
通过NuGet安装最新版NPOI包:
Install-Package NPOI
2.2.2 文档生成示例
using NPOI.XWPF.UserModel;using System.IO;public class DocumentGenerator{public void CreateSampleDocument(string outputPath){// 创建空白文档var document = new XWPFDocument();// 添加标题var title = document.CreateParagraph();title.Alignment = ParagraphAlignment.CENTER;var titleRun = title.CreateRun();titleRun.SetText("技术文档示例");titleRun.FontSize = 20;titleRun.IsBold = true;// 添加正文段落var paragraph = document.CreateParagraph();var run = paragraph.CreateRun();run.SetText("这是使用NPOI生成的文档内容。");// 保存文档using (var fileStream = new FileStream(outputPath, FileMode.Create)){document.Write(fileStream);}}}
2.2.3 文档解析技巧
处理现有文档时,可通过XWPFDocument类加载文件:
public void ReadDocument(string inputPath){using (var fileStream = new FileStream(inputPath, FileMode.Open)){var document = new XWPFDocument(fileStream);// 遍历段落foreach (var paragraph in document.Paragraphs){Console.WriteLine(paragraph.Text);}// 处理表格foreach (var table in document.Tables){foreach (var row in table.GetRows()){foreach (var cell in row.GetTableCells()){Console.Write($"{cell.GetText()}\t");}Console.WriteLine();}}}}
三、字符串处理:比较方法深度解析
3.1 字符串比较基础
C#提供两种主要比较方式:
- 静态方法:
String.Compare - 实例方法:
String.CompareTo
3.2 Compare方法详解
public static int Compare(string strA,string strB,bool ignoreCase = false,CultureInfo culture = null)
参数说明:
ignoreCase:是否忽略大小写culture:指定文化信息(影响字母排序规则)
返回值含义:
- <0:strA小于strB
- 0:字符串相等
-
0:strA大于strB
3.3 CompareTo方法实现
public int CompareTo(string strB){return String.Compare(this, strB, StringComparison.CurrentCulture);}
该方法实际调用String.Compare,使用当前文化设置。
3.4 比较规则选择指南
| 比较类型 | 推荐方法 | 适用场景 |
|---|---|---|
| 区分大小写 | String.Compare |
密码验证等严格场景 |
| 不区分大小写 | String.Compare(ignoreCase:true) |
用户名搜索等用户友好场景 |
| 特定文化比较 | 指定CultureInfo参数 | 多语言环境下的排序 |
| 序数字符串比较 | String.CompareOrdinal |
哈希计算等性能敏感场景 |
3.5 性能优化建议
- 缓存比较结果:对重复比较的字符串存储结果
- 使用序数比较:当不需要文化特定规则时
- 避免频繁创建CultureInfo:重用文化信息实例
四、最佳实践总结
4.1 迭代器开发建议
- 优先使用
yield return语法简化实现 - 泛型迭代器可提升类型安全性
- 考虑实现
IDisposable释放资源
4.2 文档处理注意事项
- 处理大文件时使用流式操作
- 注意不同Word版本的兼容性问题
- 考虑添加异常处理机制
4.3 字符串处理技巧
- 明确比较需求选择合适方法
- 对用户输入进行规范化处理
- 考虑使用
StringBuilder处理大量拼接操作
通过系统掌握这些核心技术,开发者能够显著提升数据处理效率,构建更健壮的企业级应用。在实际开发中,应根据具体场景选择最适合的技术方案,并遵循最佳实践确保代码质量。