C# 将数据行中的值与对象字典进行比较
我正在编写数据库测试utils代码,它将数据行值与作为字典提供的预期值(columnName,expectedColumnValue)进行比较 它可以很好地用于许多类型,但对于byte和short,我必须添加转换代码,将值转换为Int32 两个问题:C# 将数据行中的值与对象字典进行比较,c#,equality,C#,Equality,我正在编写数据库测试utils代码,它将数据行值与作为字典提供的预期值(columnName,expectedColumnValue)进行比较 它可以很好地用于许多类型,但对于byte和short,我必须添加转换代码,将值转换为Int32 两个问题: 您是否有如何改进此代码的想法,即如何避免转换? 对于decimal和float,它似乎可以工作,因为它们被显式声明为十进制/浮点值。Long也可以毫无问题地工作 如果没有其他方法,除了short和byte之外,还有其他类型需要我担心吗 演示代码如下
var table = new DataTable();
table.Columns.Add(new DataColumn("CarrierId", typeof(byte)));
table.Columns.Add(new DataColumn("NotationId", typeof(short)));
var row = table.NewRow();
row[0] = 5;
row[1] = 123;
table.Rows.Add(row);
var expected = new Dictionary<string, object>
{
{"CarrierId", 5},
{"NotationId", 123},
};
foreach (var entry in expected)
{
var value = row[entry.Key];
var expectedValue = entry.Value;
if (value is short || value is byte)
value = Convert.ToInt32(value);
Console.WriteLine();
Console.WriteLine(String.Format("Not converted: {0}", row[entry.Key].Equals(entry.Value)));
Console.WriteLine(String.Format("Converted (if applicable): {0}", value.Equals(expectedValue)));
}
var table=newdatatable();
table.Columns.Add(新数据列(“CarrierId”,typeof(byte));
表.Columns.Add(新数据列(“NotationId”,typeof(short)));
var row=table.NewRow();
行[0]=5;
第[1]行=123;
table.Rows.Add(行);
var应为新字典
{
{“CarrierId”,5},
{“NotationId”,123},
};
foreach(预期中的var条目)
{
var值=行[entry.Key];
var expectedValue=条目.Value;
if(值较短| |值为字节)
值=转换为32(值);
Console.WriteLine();
WriteLine(String.Format(“未转换:{0}”,行[entry.Key].Equals(entry.Value));
WriteLine(String.Format(“已转换(如果适用):{0}”,value.Equals(expectedValue));
}
将其预期类型中的值添加到字典中,则在比较时不需要再进行转换:
var expected = new Dictionary<string, object>
{
{ "CarrierId", (byte)5 },
{ "NotationId", (short)123 },
};
但当您将其分配给对象
变量时,C#不知道您将来会将其用作字节
,并且默认情况下会将其用作int
object o = 5; // Stores an int
将其预期类型中的值添加到字典中,则在比较时不需要再进行转换:
var expected = new Dictionary<string, object>
{
{ "CarrierId", (byte)5 },
{ "NotationId", (short)123 },
};
但当您将其分配给对象
变量时,C#不知道您将来会将其用作字节
,并且默认情况下会将其用作int
object o = 5; // Stores an int
除了Olivier Jacot Descombes的答案外,您还可以尝试以下代码:
object o = 5;
var v = o;
if (v is short)
MessageBox.Show("short");
else if (v is byte)
MessageBox.Show("byte");
else if (v is int)
MessageBox.Show("int");
每当您将
整数
文本分配给对象
时,它本质上是int,因此,var
将是int
。因此,我建议您从数据库中使用类型转换,而不是相反。除了Olivier Jacot Descombes的答案外,您还可以尝试以下代码:
object o = 5;
var v = o;
if (v is short)
MessageBox.Show("short");
else if (v is byte)
MessageBox.Show("byte");
else if (v is int)
MessageBox.Show("int");
每当您将
整数
文本分配给对象
时,它本质上是int,因此,var
将是int
。因此,我建议您使用从数据库转换为类型,而不是从数据库转换为类型。使用强类型扩展方法。避免像瘟疫一样使用数据集/数据表/数据行。使用自定义类和ORM:)@TimSchmelter:为了尽可能简单,我希望避免传递类型。否则,我需要更改每个需要测试的表的代码。@dumdum-当表/数据集已经使用强类型扩展方法时,很难避免它们。避免像瘟疫一样的数据集/数据表/数据行。使用自定义类和ORM:)@TimSchmelter:为了尽可能简单,我希望避免传递类型。否则,我需要更改每个需要测试的表的代码。@dumdum-当表/数据集已经存在时,很难避免使用它们。在本例中,字节b=5;它将int隐式转换为byte,检查@Nick:Yes,但这可能只适用于literal。我猜生成的IL代码不会有任何转换。@OlivierJacot Descombes如果它是一个int变量,那么它在没有显式强制转换的情况下不会编译,请自己尝试int k=5;字节b=k;不起作用,但这将是字节b=(int)k;你的回答很好,我只是想补充一点来支持你所说的。你从我这里得到+1;)事件在这种情况下字节b=5;它将int隐式转换为byte,检查@Nick:Yes,但这可能只适用于literal。我猜生成的IL代码不会有任何转换。@OlivierJacot Descombes如果它是一个int变量,那么它在没有显式强制转换的情况下不会编译,请自己尝试int k=5;字节b=k;不起作用,但这将是字节b=(int)k;你的回答很好,我只是想补充一点来支持你所说的。你从我这里得到+1;)这是真的,但是,如果你像Olivier建议的那样将5赋给一个对象时将其强制转换为短的,那么第一个if的计算结果为true:object p=(short)5;var x=p@乔安娜:当然,应该是这样的。Var变量根据右侧类型的实数类型确定是的,Var
的实数类型根据等号右侧表达式的静态类型进行计算。o
中的值类型没有区别v
将始终是一个对象
。然而,存储在v
中的值将是int
。这是正确的,但是,如果您在将5分配给对象时按照Olivier的建议将其强制转换为短5,则第一个if的计算结果为真:object p=(short)5;var x=p@乔安娜:当然,应该是这样的。Var变量根据右侧类型的实数类型确定是的,Var
的实数类型根据等号右侧表达式的静态类型进行计算。o
中的值类型没有区别<代码>v将始终