将DataRow中的值与对象Dictionary进行比较

时间:2012-10-26 20:55:02

标签: c# equality

我正在编写数据库test utils代码,它将DataRow值与作为Dictionary提供的期望值进行比较(columnName,expectedColumnValue)。

它适用于许多类型,但对于字节和短,我必须添加转换代码,将值转换为Int32。

两个问题:

  1. 您是否了解如何更好地使用此代码,即如何避免转换? 对于decimal和float,它似乎工作,因为它们被显式声明为十进制/浮点值。 Long也可以毫无问题地工作。

  2. 如果没有其他方法,除了短片和字节之外还有其他类型我需要担心吗?

  3. 以下演示代码:

                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)));
    
                }
    

2 个答案:

答案 0 :(得分:3)

将预期类型的​​值添加到字典中,然后在比较时不再需要进行转换:

var expected = new Dictionary<string, object>
{
    { "CarrierId", (byte)5 },
    { "NotationId", (short)123 },
};

当您将由常量表达式(在编译时已知)给出的int数字分配给byte变量时,C#会自动将其转换为byte

byte b = 5; // Stores a byte

但是当您将其分配给object变量时,C#不知道您将来会将其用作byte,并默认将其威胁为int。< / p>

object o = 5; // Stores an int

答案 1 :(得分:0)

除了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");

每当您为integer分配object字面值时,它基本上都是整数,因此var将为int。因此,我建议您使用数据库中的类型转换而不是反之亦然。