Bumblebee/Classes/ExRow.cs
Flow diagram
这个流程图展示了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) 复制构造函数:
/// <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) 列名和行值构造函数:
/// <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) 列名、行值和格式值构造函数:
/// <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属性:
/// <summary>
/// 获取所有列名
/// </summary>
public List<string> Columns
{
get { return values.Keys.ToList(); }
}
解释:
- 这是一个只读属性,返回values字典的所有键(即列名)作为一个列表。
- 使用LINQ的ToList()方法将字典的键集合转换为List。
b) Values属性:
/// <summary>
/// 获取所有行值
/// </summary>
public List<string> Values
{
get { return values.Values.ToList(); }
}
解释:
- 这是一个只读属性,返回values字典的所有值(即行值)作为一个列表。
- 使用LINQ的ToList()方法将字典的值集合转换为List。
c) Formats属性:
/// <summary>
/// 获取所有格式值
/// </summary>
public List<string> Formats
{
get { return formats.Values.ToList(); }
}
解释:
- 这是一个只读属性,返回formats字典的所有值(即格式)作为一个列表。
- 使用LINQ的ToList()方法将字典的值集合转换为List。
- 方法
a) ToString() 方法:
/// <summary>
/// 重写ToString方法,返回行的简要信息
/// </summary>
/// <returns>包含行信息的字符串</returns>
public override string ToString()
{
return "Row | c:" + values.Count;
}
解释:
- 这个方法重写了Object.ToString()方法。
- 返回一个字符串,表示这是一个"Row"对象,并显示values字典中的元素数量。
- 这对于调试和日志记录很有用,提供了对象的简要描述。
总结:
ExRow类提供了一种灵活而强大的方式来表示和操作Excel中的一行数据。它的设计允许轻松创建、复制和访问行数据,同时保持了良好的封装性。
- 构造函数的多样性如何提供了创建ExRow对象的不同方式,适应不同的使用场景。
- 属性的设计如何提供了对内部数据的安全访问,同时保持了良好的性能。
- ToString()方法的重写如何提供了对象的简洁描述,有助于调试和日志记录。
- 使用字典存储数据的优势,如快速访问和灵活的键值对管理。
- 代码的清晰结构和详细注释如何提高了可读性和可维护性。
这个类为处理Excel数据提供了一个坚实的基础,可以在此基础上构建更复杂的功能。它展示了如何将复杂的数据结构封装在一个易于使用的类中,这是良好软件设计的一个典型例子。
Code
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
}
}