基于传入运算符对DataTable执行通用算术运算的实现问询
问题描述
我希望基于作为方法参数传入的运算符执行算术运算,目前面临的问题是需要操作的对象为DataTable,且无法仅传入单行数据,需处理多行数据。
我已尝试通过委托方式实现,示例代码如下:
public int MainOperationSimplifeid(Func<int, int, int> operatoru) { if (beforeoperation == 2) { a2 = Convert.ToInt32(textBox1.Text); textBox1.Text = ""; result = operatoru(a1, a2); // textBox1.Text = Convert.ToString(result); a1 = 0; a2 = 0; } beforeoperation++; return result; }
我了解也可通过枚举、switch或方法重载实现,但现有代码已庞大复杂,不希望增加额外复杂度。
我期望实现如下形式的通用方案,以提升代码复用性,避免重复编写不同运算符对应的重复代码:
void MethodName(DataTable dt, int operand, char op) { //few lines of code dt.SomeRowName1 = (double)dtRowValue op operand; //few lines of code dt.SomeRowName2 = (double)dtRowValue op operand; dt.SomeRowName3 = (double)dtRowValue op operand; //few lines of code }
请问是否可实现此类基于传入运算符对DataTable进行通用算术运算的方案?
解决方案
可以实现,推荐基于委托+泛型的方案,既符合你对低复杂度的要求,又能实现通用的DataTable多行运算。
步骤1:定义通用运算委托
先定义一个处理数值运算的委托,支持double类型(覆盖你示例中的转换需求):
public delegate double ArithmeticOperation(double left, double right);
步骤2:封装通用DataTable处理方法
把你需要重复执行的逻辑抽出来,传入委托而非运算符字符,这样既灵活又避免了switch分支:
void ProcessDataTable(DataTable dt, int operand, ArithmeticOperation operation) { // 通用前置代码 foreach (DataRow row in dt.Rows) { // 替换为你实际需要处理的列名 double rowValue1 = Convert.ToDouble(row["SomeRowName1"]); row["SomeRowName1"] = operation(rowValue1, operand); double rowValue2 = Convert.ToDouble(row["SomeRowName2"]); row["SomeRowName2"] = operation(rowValue2, operand); double rowValue3 = Convert.ToDouble(row["SomeRowName3"]); row["SomeRowName3"] = operation(rowValue3, operand); } // 通用后置代码 }
步骤3:调用示例
使用时直接传入对应的运算逻辑,无需额外分支判断:
// 加法运算 ProcessDataTable(myDataTable, 10, (x, y) => x + y); // 乘法运算 ProcessDataTable(myDataTable, 5, (x, y) => x * y); // 自定义运算(比如取模) ProcessDataTable(myDataTable, 3, (x, y) => x % y);
可选:支持传入运算符字符
如果一定要支持传入char类型的运算符,可以加一个轻量映射层,把字符转换成对应委托,避免大量switch:
private static readonly Dictionary<char, ArithmeticOperation> _opMap = new() { { '+', (x,y) => x + y }, { '-', (x,y) => x - y }, { '*', (x,y) => x * y }, { '/', (x,y) => x / y }, { '%', (x,y) => x % y } }; // 调用时 ProcessDataTable(myDataTable, 10, _opMap['+']);
这种方式既满足了你传入运算符字符的需求,又不会增加过多复杂度,完全适配现有代码架构。
内容的提问来源于stack exchange,提问作者StackUseR
相关产品推荐
相关产品推荐

