4

我目前正在重构代码以将 Convert.To 替换为 TryParse。

我遇到了以下代码,它正在创建一个属性并将其分配给一个对象。

List<Person> list = new List<Person>();

foreach (DataRow row in dt.Rows)
{
     var p = new Person{ RecordID = Convert.ToInt32(row["ContactID"]) };

     list.Add(p);
}

我想出的替代品是:

var p = new Person { RecordID = Int32.TryParse(row["ContactID"].ToString(), out RecordID) ? RecordID : RecordID };

有什么想法、意见、替代我所做的事情吗?

4

4 回答 4

9

写一个扩展方法。

public static Int32? ParseInt32(this string str) {
    Int32 k;
    if(Int32.TryParse(str, out k))
        return k;
    return null;
}
于 2008-11-12T14:24:17.417 回答
2

我会使用一个替代实现TryParse,它返回一个int?

public static int? TryParseInt32(string x)
{
    int value;
    return int.TryParse(x, out value) ? value : (int?) null;
}

然后你可以写:

var p = new Person { RecordID = Helpers.TryParseInt32(row["ContactID"].ToString()) ?? 0 };

(或者,如果您愿意,可以使用不同的默认值 - 无论哪种方式,它都会在您的代码中可见。)

于 2008-11-12T14:24:47.463 回答
0

我建议将 TryParse 部分与初始化程序分开。它将更具可读性。

int recordId;
Int32.TryParse(row["ContactID"].ToString(), out recordID)

foreach (DataRow row in dt.Rows)
{
     var p = new Person{ RecordID = recordId };
     list.Add(p);
}
于 2008-11-12T14:28:58.827 回答
0
private static void TryToDecimal(string str, Action<decimal> action)
{
        if (decimal.TryParse(str, out decimal ret))
        {
            action(ret);
        }
        else
        {
            //do something you want
        }
}

TryToDecimal(strList[5], (x) => { st.LastTradePrice = x; });
TryToDecimal(strList[3], (x) => { st.LastClosedPrice = x; });
TryToDecimal(strList[6], (x) => { st.TopPrice = x; });
TryToDecimal(strList[7], (x) => { st.BottomPrice = x; });
TryToDecimal(strList[10], (x) => { st.PriceChange = x; });
于 2019-01-08T01:56:38.233 回答