Bumblebee/Classes/ExRow.cs
Flow diagram
复制构造函数
Copy Constructor 列名和行值构造函数
Column Names and Row Values Constructor 列名 行值和格式值构造函数
Column Names Row Values and Format Values Constructor 数据操作
Data Operations 格式操作
Format Operations 属性访问
Property Access 开始 / Start 创建 ExRow 实例
Create ExRow Instance 选择构造方法
Choose Constructor 从现有 ExRow 创建
Create from Existing ExRow 从列名和行值创建
Create from Column Names and Row Values 从列名 行值和格式值创建
Create from Column Names Row Values and Format Values 选择操作类型
Choose Operation Type 访问/修改数据
Access/Modify Data 访问/修改格式
Access/Modify Formats 获取属性
Get Properties 访问 values 字典
Access values Dictionary 修改 values 字典
Modify values Dictionary 访问 formats 字典
Access formats Dictionary 修改 formats 字典
Modify formats Dictionary 获取 Columns
Get Columns 获取 Values
Get Values 获取 Formats
Get Formats 调用 ToString 方法
Call ToString Method 结束 / End
这个流程图展示了ExRow
类的主要结构:
-
Class Structure (类结构):
- ExRow inherits from ExData (ExRow 继承自 ExData)
- It has two main dictionaries: values and formats (它有两个主要的字典: values 和 formats)
-
Constructors (构造函数):
- ExRow(ExRow): Copy constructor (复制构造函数)
- ExRow(List, List): Constructor with column names and row values (带列名和行值的构造函数)
- ExRow(List, List, List): Constructor with column names, row values, and format values (带列名、行值和格式值的构造函数)
-
Properties (属性):
- Columns: Get list of column names (获取列名列表)
- Values: Get list of values (获取值列表)
- Formats: Get list of formats (获取格式列表)
-
Methods (方法):
- ToString(): Override to provide custom string representation (重写以提供自定义的字符串表示)
这个流程图清晰地展示了ExRow
类的结构和主要组成部分,有助于理解代码的整体架构。
Description
逐个分析每个方法。
- 构造函数
a) 复制构造函数:
csharp
/// <summary>
/// 复制构造函数,创建一个现有ExRow对象的深拷贝
/// </summary>
/// <param name="exRow">要复制的ExRow对象</param>
public ExRow(ExRow exRow) : base(exRow)
{
// 遍历原始对象的values字典,复制每个键值对到新对象中
foreach(string key in exRow.values.Keys)
{
values.Add(key, exRow.values[key]);
formats.Add(key, exRow.formats[key]);
}
}
解释:
- 这个构造函数创建一个现有ExRow对象的深拷贝。
: base(exRow)
调用基类的复制构造函数,确保基类成员也被正确复制。- 使用foreach循环遍历原始对象的values字典的所有键。
- 对每个键,将对应的值从原始对象的values和formats字典复制到新对象中。
- 这确保了新创建的ExRow对象是原始对象的完整独立副本。
b) 列名和行值构造函数:
csharp
/// <summary>
/// 从列名和行值创建ExRow对象的构造函数
/// </summary>
/// <param name="columnNames">列名列表</param>
/// <param name="rowValues">行值列表</param>
public ExRow(List<string> columnNames, List<string> rowValues) : base(DataTypes.Row)
{
int count = columnNames.Count;
int vCount = rowValues.Count;
// 如果行值数量不足,用空字符串填充
for(int i = vCount; i < count; i++)
{
rowValues.Add("");
}
// 将列名和对应的行值添加到values字典中
// 同时为每列添加默认的"General"格式到formats字典中
for(int i = 0; i < count; i++)
{
values.Add(columnNames[i], rowValues[i]);
formats.Add(columnNames[i], "General");
}
}
解释:
- 这个构造函数接受列名列表和行值列表作为参数。
: base(DataTypes.Row)
调用基类构造函数,指定这是一个行类型的对象。- 首先确保行值列表的长度与列名列表相同,如果行值不足,就用空字符串填充。
- 然后,使用for循环遍历所有列名。
- 对每个列名,将其与对应的行值添加到values字典中。
- 同时,为每列添加默认的"General"格式到formats字典中。
c) 列名、行值和格式值构造函数:
csharp
/// <summary>
/// 从列名、行值和格式值创建ExRow对象的构造函数
/// </summary>
/// <param name="columnNames">列名列表</param>
/// <param name="rowValues">行值列表</param>
/// <param name="formatValues">格式值列表</param>
public ExRow(List<string> columnNames, List<string> rowValues, List<string> formatValues) : base(DataTypes.Row)
{
int count = columnNames.Count;
int vCount = rowValues.Count;
int fCount = formatValues.Count;
// 如果行值数量不足,用空字符串填充
for (int i = vCount; i < count; i++)
{
rowValues.Add("");
}
// 如果格式值数量不足,用"General"填充
for (int i = fCount; i < count; i++)
{
formatValues.Add("General");
}
// 将列名、行值和格式值分别添加到values和formats字典中
for (int i = 0; i < count; i++)
{
values.Add(columnNames[i], rowValues[i]);
formats.Add(columnNames[i], formatValues[i]);
}
}
解释:
- 这个构造函数类似于前一个,但增加了格式值列表作为参数。
- 首先确保行值和格式值列表的长度与列名列表相同,不足时分别用空字符串和"General"填充。
- 然后,使用for循环遍历所有列名。
- 对每个列名,将其与对应的行值添加到values字典中,将对应的格式值添加到formats字典中。
- 属性
a) Columns属性:
csharp
/// <summary>
/// 获取所有列名
/// </summary>
public List<string> Columns
{
get { return values.Keys.ToList(); }
}
解释:
- 这是一个只读属性,返回values字典的所有键(即列名)作为一个列表。
- 使用LINQ的ToList()方法将字典的键集合转换为List。
b) Values属性:
csharp
/// <summary>
/// 获取所有行值
/// </summary>
public List<string> Values
{
get { return values.Values.ToList(); }
}
解释:
- 这是一个只读属性,返回values字典的所有值(即行值)作为一个列表。
- 使用LINQ的ToList()方法将字典的值集合转换为List。
c) Formats属性:
csharp
/// <summary>
/// 获取所有格式值
/// </summary>
public List<string> Formats
{
get { return formats.Values.ToList(); }
}
解释:
- 这是一个只读属性,返回formats字典的所有值(即格式)作为一个列表。
- 使用LINQ的ToList()方法将字典的值集合转换为List。
- 方法
a) ToString() 方法:
csharp
/// <summary>
/// 重写ToString方法,返回行的简要信息
/// </summary>
/// <returns>包含行信息的字符串</returns>
public override string ToString()
{
return "Row | c:" + values.Count;
}
解释:
- 这个方法重写了Object.ToString()方法。
- 返回一个字符串,表示这是一个"Row"对象,并显示values字典中的元素数量。
- 这对于调试和日志记录很有用,提供了对象的简要描述。
总结:
ExRow类提供了一种灵活而强大的方式来表示和操作Excel中的一行数据。它的设计允许轻松创建、复制和访问行数据,同时保持了良好的封装性。
- 构造函数的多样性如何提供了创建ExRow对象的不同方式,适应不同的使用场景。
- 属性的设计如何提供了对内部数据的安全访问,同时保持了良好的性能。
- ToString()方法的重写如何提供了对象的简洁描述,有助于调试和日志记录。
- 使用字典存储数据的优势,如快速访问和灵活的键值对管理。
- 代码的清晰结构和详细注释如何提高了可读性和可维护性。
这个类为处理Excel数据提供了一个坚实的基础,可以在此基础上构建更复杂的功能。它展示了如何将复杂的数据结构封装在一个易于使用的类中,这是良好软件设计的一个典型例子。
Code
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Bumblebee
{
public class ExRow : ExData
{
#region members
// 存储行中每列的值
protected Dictionary<string, string> values = new Dictionary<string, string>();
// 存储行中每列的格式
protected Dictionary<string, string> formats = new Dictionary<string, string>();
#endregion
#region constructors
/// <summary>
/// 复制构造函数
/// </summary>
/// <param name="exRow">要复制的ExRow对象</param>
public ExRow(ExRow exRow) : base(exRow)
{
// 遍历原始对象的values字典,复制每个键值对
foreach (string key in exRow.values.Keys)
{
values.Add(key, exRow.values[key]);
formats.Add(key, exRow.formats[key]);
}
}
/// <summary>
/// 从列名和行值创建ExRow对象的构造函数
/// </summary>
/// <param name="columnNames">列名列表</param>
/// <param name="rowValues">行值列表</param>
public ExRow(List<string> columnNames, List<string> rowValues) : base(DataTypes.Row)
{
int count = columnNames.Count;
int vCount = rowValues.Count;
// 如果行值数量不足,用空字符串填充
for (int i = vCount; i < count; i++)
{
rowValues.Add("");
}
// 将列名和对应的行值添加到values字典中
// 同时为每列添加默认的"General"格式到formats字典中
for (int i = 0; i < count; i++)
{
values.Add(columnNames[i], rowValues[i]);
formats.Add(columnNames[i], "General");
}
}
/// <summary>
/// 从列名、行值和格式值创建ExRow对象的构造函数
/// </summary>
/// <param name="columnNames">列名列表</param>
/// <param name="rowValues">行值列表</param>
/// <param name="formatValues">格式值列表</param>
public ExRow(List<string> columnNames, List<string> rowValues, List<string> formatValues) : base(DataTypes.Row)
{
int count = columnNames.Count;
int vCount = rowValues.Count;
int fCount = formatValues.Count;
// 如果行值数量不足,用空字符串填充
for (int i = vCount; i < count; i++)
{
rowValues.Add("");
}
// 如果格式值数量不足,用"General"填充
for (int i = fCount; i < count; i++)
{
formatValues.Add("General");
}
// 将列名、行值和格式值分别添加到values和formats字典中
for (int i = 0; i < count; i++)
{
values.Add(columnNames[i], rowValues[i]);
formats.Add(columnNames[i], formatValues[i]);
}
}
#endregion
#region properties
/// <summary>
/// 获取所有列名
/// </summary>
public List<string> Columns
{
get { return values.Keys.ToList(); }
}
/// <summary>
/// 获取所有行值
/// </summary>
public List<string> Values
{
get { return values.Values.ToList(); }
}
/// <summary>
/// 获取所有格式值
/// </summary>
public List<string> Formats
{
get { return formats.Values.ToList(); }
}
#endregion
#region methods
#endregion
#region overrides
/// <summary>
/// 重写ToString方法,返回行的简要信息
/// </summary>
/// <returns>包含行信息的字符串</returns>
public override string ToString()
{
return "Row | c:" + values.Count;
}
#endregion
}
}