我正在为手机对象编写一个json反序列化器。
其中一个属性是电话号码。在我的数据库中,我将数字存储为一串数字。
我有一个名为IncomingClientJsonPhoneCandidate
的字符串,我正在编写一个遍历字符串每个字符的循环,并在字符传递byte.TryParse时将值添加到字符串构建器。
我想知道是否有更好的方法来做到这一点。 谢谢你的建议。
答案 0 :(得分:5)
你可以尝试
string ExtractNumericCharacters(string s)
{
return string.IsNullOrEmpty(s) ? s : new string(s.Where(c => char.IsDigit(c)).ToArray());
}
您还可以使用方法组转换而不是lambda:
string ExtractNumericCharacters(string s)
{
return string.IsNullOrEmpty(s) ? s : new string(s.Where(char.IsDigit).ToArray());
}
修改强>
要了解为什么你不能在这里使用ToString()
,让我们分开复杂的表达式:
string ExtractNumericCharacters(string s)
{
if (string.IsNullOrEmpty(s))
return s;
IEnumerable<char> numericChars = s.Where(char.IsDigit);
// numericChars is a Linq iterator; if you call ToString() on this object, you'll get the type name.
// there's no string constructor or StringBuilder Append overload that takes an IEnumerable<char>
// so we need to get a char[]. The ToArray() method iterates over the WhereEnumerator, copying
// the sequence into a new array; this is functionally equivalent to using a foreach loop with an if statement.
char[] numericCharArray = numericChars.ToArray();
// now we can make a string!
return new string(numericCharArray);
}
如果您想坚持使用StringBuilder的原始方法,可以将char[]
传递给StringBuilder的Append方法,而不是调用new string(...
。
编辑2
除了添加上面关于循环的一些细节之外,感谢McKay的评论,我想到我可以添加查询理解语法。这是我通常更喜欢扩展方法语法的一个很好的例子;在这种情况下,扩展方法更简洁:
string ExtractNumericCharacters(string s)
{
return string.IsNullOrEmpty(s) ? s : new string((from c in s where char.IsDigit(c) select c).ToArray());
}
答案 1 :(得分:0)
char.IsDigit()
(这就是你真正需要的,但我必须在这里加入更多的角色限制)
答案 2 :(得分:0)
public static string GetNumberFromStrFaster(string str)
{
str = str.Trim();
Match m = new Regex(@"^[\+\-]?\d*\.?[Ee]?[\+\-]?\d*$",
RegexOptions.Compiled).Match(str);
return (m.Value);
}
使用正则表达式
答案 3 :(得分:0)
Int32.TryParse(“13231321”)将节省您对循环的需求
答案 4 :(得分:0)
为什么不使用现有的反序列化器.NET或Json.net?