我有以下问题。我将值作为XML传递给字符串,并且我没有为数字列传递false或0等默认值。所以,我创建了一个Dictionary,其中key是列名,value是传递的值。
这是我目前的代码
foreach (KeyValuePair<String, String> kvp in rowValues)
{
String passedValue = kvp.Value.Trim();
String rowValue = bookingRow[kvp.Key].ToString().Trim();
if (passedValue != rowValue)
{
// code here
}
}
问题在于默认值。我可以通过调试我的测试用例看到,passValue为空且rowValue为0(列为整数类型)。所以,我的问题是 - 我应该如何重新编写上面的代码,以正确地将我传递的值转换为列的类型。换句话说,不是将它们都转换为字符串,而是需要将传递的值转换为正确类型的DataRow列。
passValue的样本 - “”。
rowValue =“”的示例(具有列长度的空字符串)
或另一个例子:
passedValue =“”的样本
对应的rowValue = 0(表中的值为Integer)
这两种情况都应视为相同的值 - 无需写入历史记录。
感谢答案,我现在正在测试此代码:
String passedValue = kvp.Value.Trim();
var rowValue = bookingRow[kvp.Key];
if (Convert.ChangeType(passedValue, rowValue.GetType()) != rowValue)
{
String rowValueString = rowValue.ToString().Trim();
if (rowValueString!=passedValue) // Double check to prevent cases of "" vs. " "
this.SaveToBookingHistory(booking_id, "M", kvp.Key, rowValueString, passedValue, ref messageText, ref statusCode);
}
答案 0 :(得分:4)
我没有你所有的代码,所以这可能不完全正确;但是你应该可以做这样的事情......
foreach (KeyValuePair<String, String> kvp in rowValues)
{
var rowValue = bookingRow[kvp.Key];
var passedValue = Convert.ChangeType(kvp.Value.Trim(), bookingRow[kvp.Key].GetType());
// or, if your bookingRow comes from a table
var passedValue = Convert.ChangeType(kvp.Value.Trim(), table.Columns[kvp.Key].DataType);
if (passedValue.Equals(rowValue) == false)
{
// code here
}
}
修改:您将遇到一些问题。你需要使用.Equals方法(我已经改变了上面的代码),因为ChangeType返回一个对象;和!=进行参考比较。这将处理rowValue为0并且passValue为0作为对象加框的情况。
但是,这不会解决您拥有“”和“”的情况。这两件事是不一样的,他们并不平等;并且,如果不检查它们是字符串的值,您就不知道了。所以,我建议你写一些函数来手动执行比较。
答案 1 :(得分:0)
我在Rob Jasinski的UniversalThread.com论坛上得到了解决方案。这是我的最终代码
if (bookingRow.Table.Columns.Contains(kvp.Key))
{
String passedValue = kvp.Value;
var columnValue = bookingRow[kvp.Key];
Type columnType = bookingRow[kvp.Key].GetType();
//var passedObject = Convert.ChangeType(passedValue, columnType);
if (!passedValue.StringEquals(columnValue, columnType))
{
String cColumnValue = columnValue.ToString().Trim();
if (cColumnValue != passedValue) // Double check to prevent cases of "" vs. " "
this.SaveToBookingHistory(booking_id, "M", kvp.Key, cColumnValue, passedValue, ref messageText, ref statusCode);
}
}
我还添加了以下StringEquals扩展方法:
/// <summary>
/// returns default value for the passed type
/// / See http://stackoverflow.com/questions/325426/programmatic-equivalent-of-defaulttype
/// </summary>
/// <param name="t"></param>
/// <returns></returns>
public static object GetDefault(Type t)
{
if (t.IsValueType)
{
return Activator.CreateInstance(t);
}
return null;
}
/// <summary>
/// Compare string with object (Rob Jasinski)
/// </summary>
/// <param name="stringValue"></param>
/// <param name="objectValue"></param>
/// <param name="objectType"></param>
/// <returns></returns>
public static bool StringEquals(this String stringValue, object objectValue, Type objectType)
{
object convertedStringValue = GetDefault(objectType);
if (!string.IsNullOrWhiteSpace(stringValue))
convertedStringValue = Convert.ChangeType(stringValue, objectType);
return object.Equals(convertedStringValue, objectValue);
}