C# 迭代器与字符串处理深度解析

一、迭代器模式:IEnumerable与IEnumerator接口详解

1.1 迭代器设计原理

在.NET框架中,迭代器模式通过IEnumerableIEnumerator接口实现集合元素的遍历。这种设计将数据存储与遍历逻辑解耦,开发者只需实现标准接口即可创建自定义可迭代对象。

IEnumerable接口定义了获取迭代器的标准方法:

  1. public interface IEnumerable
  2. {
  3. IEnumerator GetEnumerator();
  4. }

IEnumerator接口则包含三个核心成员:

  • Current属性:获取当前元素
  • MoveNext()方法:推进迭代器到下一个位置
  • Reset()方法:重置迭代器状态(已过时,不推荐使用)

1.2 迭代器实现模式

1.2.1 显式实现方式

通过手动实现接口创建迭代器:

  1. public class NumberRange : IEnumerable
  2. {
  3. private int _start;
  4. private int _end;
  5. public NumberRange(int start, int end)
  6. {
  7. _start = start;
  8. _end = end;
  9. }
  10. public IEnumerator GetEnumerator()
  11. {
  12. return new NumberRangeEnumerator(_start, _end);
  13. }
  14. private class NumberRangeEnumerator : IEnumerator
  15. {
  16. private int _current;
  17. private int _end;
  18. public NumberRangeEnumerator(int start, int end)
  19. {
  20. _current = start - 1;
  21. _end = end;
  22. }
  23. public object Current => _current;
  24. public bool MoveNext()
  25. {
  26. if (_current >= _end) return false;
  27. _current++;
  28. return true;
  29. }
  30. }
  31. }

1.2.2 编译器生成方式

使用yield return语法糖自动生成迭代器:

  1. public class NumberRange : IEnumerable
  2. {
  3. private int _start;
  4. private int _end;
  5. public NumberRange(int start, int end)
  6. {
  7. _start = start;
  8. _end = end;
  9. }
  10. public IEnumerator GetEnumerator()
  11. {
  12. for (int i = _start; i <= _end; i++)
  13. {
  14. yield return i;
  15. }
  16. }
  17. }

编译器会将此类代码转换为状态机实现,包含完整的迭代器逻辑。

1.3 泛型迭代器优化

.NET 2.0引入的泛型接口IEnumerable<T>IEnumerator<T>消除了类型转换开销:

  1. public interface IEnumerable<out T> : IEnumerable
  2. {
  3. new IEnumerator<T> GetEnumerator();
  4. }
  5. public interface IEnumerator<out T> : IDisposable, IEnumerator
  6. {
  7. new T Current { get; }
  8. }

二、文档处理: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包:

  1. Install-Package NPOI

2.2.2 文档生成示例

  1. using NPOI.XWPF.UserModel;
  2. using System.IO;
  3. public class DocumentGenerator
  4. {
  5. public void CreateSampleDocument(string outputPath)
  6. {
  7. // 创建空白文档
  8. var document = new XWPFDocument();
  9. // 添加标题
  10. var title = document.CreateParagraph();
  11. title.Alignment = ParagraphAlignment.CENTER;
  12. var titleRun = title.CreateRun();
  13. titleRun.SetText("技术文档示例");
  14. titleRun.FontSize = 20;
  15. titleRun.IsBold = true;
  16. // 添加正文段落
  17. var paragraph = document.CreateParagraph();
  18. var run = paragraph.CreateRun();
  19. run.SetText("这是使用NPOI生成的文档内容。");
  20. // 保存文档
  21. using (var fileStream = new FileStream(outputPath, FileMode.Create))
  22. {
  23. document.Write(fileStream);
  24. }
  25. }
  26. }

2.2.3 文档解析技巧

处理现有文档时,可通过XWPFDocument类加载文件:

  1. public void ReadDocument(string inputPath)
  2. {
  3. using (var fileStream = new FileStream(inputPath, FileMode.Open))
  4. {
  5. var document = new XWPFDocument(fileStream);
  6. // 遍历段落
  7. foreach (var paragraph in document.Paragraphs)
  8. {
  9. Console.WriteLine(paragraph.Text);
  10. }
  11. // 处理表格
  12. foreach (var table in document.Tables)
  13. {
  14. foreach (var row in table.GetRows())
  15. {
  16. foreach (var cell in row.GetTableCells())
  17. {
  18. Console.Write($"{cell.GetText()}\t");
  19. }
  20. Console.WriteLine();
  21. }
  22. }
  23. }
  24. }

三、字符串处理:比较方法深度解析

3.1 字符串比较基础

C#提供两种主要比较方式:

  • 静态方法String.Compare
  • 实例方法String.CompareTo

3.2 Compare方法详解

  1. public static int Compare(
  2. string strA,
  3. string strB,
  4. bool ignoreCase = false,
  5. CultureInfo culture = null
  6. )

参数说明:

  • ignoreCase:是否忽略大小写
  • culture:指定文化信息(影响字母排序规则)

返回值含义:

  • <0:strA小于strB
  • 0:字符串相等
  • 0:strA大于strB

3.3 CompareTo方法实现

  1. public int CompareTo(string strB)
  2. {
  3. return String.Compare(this, strB, StringComparison.CurrentCulture);
  4. }

该方法实际调用String.Compare,使用当前文化设置。

3.4 比较规则选择指南

比较类型 推荐方法 适用场景
区分大小写 String.Compare 密码验证等严格场景
不区分大小写 String.Compare(ignoreCase:true) 用户名搜索等用户友好场景
特定文化比较 指定CultureInfo参数 多语言环境下的排序
序数字符串比较 String.CompareOrdinal 哈希计算等性能敏感场景

3.5 性能优化建议

  1. 缓存比较结果:对重复比较的字符串存储结果
  2. 使用序数比较:当不需要文化特定规则时
  3. 避免频繁创建CultureInfo:重用文化信息实例

四、最佳实践总结

4.1 迭代器开发建议

  1. 优先使用yield return语法简化实现
  2. 泛型迭代器可提升类型安全性
  3. 考虑实现IDisposable释放资源

4.2 文档处理注意事项

  1. 处理大文件时使用流式操作
  2. 注意不同Word版本的兼容性问题
  3. 考虑添加异常处理机制

4.3 字符串处理技巧

  1. 明确比较需求选择合适方法
  2. 对用户输入进行规范化处理
  3. 考虑使用StringBuilder处理大量拼接操作

通过系统掌握这些核心技术,开发者能够显著提升数据处理效率,构建更健壮的企业级应用。在实际开发中,应根据具体场景选择最适合的技术方案,并遵循最佳实践确保代码质量。