C# 将数据行中的值与对象字典进行比较

C# 将数据行中的值与对象字典进行比较,c#,equality,C#,Equality,我正在编写数据库测试utils代码,它将数据行值与作为字典提供的预期值(columnName,expectedColumnValue)进行比较 它可以很好地用于许多类型,但对于byte和short,我必须添加转换代码,将值转换为Int32 两个问题: 您是否有如何改进此代码的想法,即如何避免转换? 对于decimal和float,它似乎可以工作,因为它们被显式声明为十进制/浮点值。Long也可以毫无问题地工作 如果没有其他方法,除了short和byte之外,还有其他类型需要我担心吗 演示代码如下

我正在编写数据库测试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将始终