在C#2.0中检查字符串中每个字符的最有效方法是什么?如果它们都是有效的十六进制字符则返回true,否则返回false?
void Test() { OnlyHexInString("123ABC"); // Returns true OnlyHexInString("123def"); // Returns true OnlyHexInString("123g"); // Returns false } bool OnlyHexInString(string text) { // Most efficient algorithm to check each digit in C# 2.0 goes here }
Jeremy Ruten.. 72
像这样的东西:
(我不知道C#所以我不知道如何循环字符串的字符.)
loop through the chars { bool is_hex_char = (current_char >= '0' && current_char <= '9') || (current_char >= 'a' && current_char <= 'f') || (current_char >= 'A' && current_char <= 'F'); if (!is_hex_char) { return false; } } return true;
上面的逻辑代码
private bool IsHex(IEnumerablechars) { bool isHex; foreach(var c in chars) { isHex = ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); if(!isHex) return false; } return true; }
对于一个有锤子的男人来说,每个问题看起来都像一个钉子 (56认同)
我觉得奇怪的是,有很多人为了这个而跳上正则表达式...... (13认同)
CMS.. 64
public bool OnlyHexInString(string test) { // For C-style hex notation (0xFF) you can use @"\A\b(0[xX])?[0-9a-fA-F]+\b\Z" return System.Text.RegularExpressions.Regex.IsMatch(test, @"\A\b[0-9a-fA-F]+\b\Z"); }
对于问题所暗示的速度,您需要编译正则表达式而不是连续地对其进行求值. (8认同)
编译或不编译,这是问题... http://tinyurl.com/6ltmxv (4认同)
根本没有使用正则表达式来解决这个问题吗?有一天我将不得不衡量它,但我不敢相信它会比Jeremy Ruten的解决方案更快(http://stackoverflow.com/questions/223832/check-a-string-to-see-if-all -characters-是十六进制值#223854). (4认同)
确实 - 快速测试(在Jon Skeet的Micro Benchmark代码的帮助下)显示,即使使用预编译的正则表达式,Jeremy Ruten概述的简单技术也要快5倍. (4认同)
程序员效率v.程序效率.像往常一样,真正的答案是'它取决于'.链接@CMS的Thx. (3认同)
Eoin Campbel.. 27
您可以对字符串执行TryParse以测试其整数中的字符串是否为十六进制数.
如果它是一个特别长的字符串,你可以把它放在块中并循环遍历它.
// string hex = "bacg123"; Doesn't parse // string hex = "bac123"; Parses string hex = "bacg123"; long output; long.TryParse(hex, System.Globalization.NumberStyles.HexNumber, null, out output);
itsmatt.. 10
我习惯Int32.TryParse()
这样做. 这是MSDN页面.
像这样的东西:
(我不知道C#所以我不知道如何循环字符串的字符.)
loop through the chars { bool is_hex_char = (current_char >= '0' && current_char <= '9') || (current_char >= 'a' && current_char <= 'f') || (current_char >= 'A' && current_char <= 'F'); if (!is_hex_char) { return false; } } return true;
上面的逻辑代码
private bool IsHex(IEnumerablechars) { bool isHex; foreach(var c in chars) { isHex = ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')); if(!isHex) return false; } return true; }
public bool OnlyHexInString(string test) { // For C-style hex notation (0xFF) you can use @"\A\b(0[xX])?[0-9a-fA-F]+\b\Z" return System.Text.RegularExpressions.Regex.IsMatch(test, @"\A\b[0-9a-fA-F]+\b\Z"); }
您可以对字符串执行TryParse以测试其整数中的字符串是否为十六进制数.
如果它是一个特别长的字符串,你可以把它放在块中并循环遍历它.
// string hex = "bacg123"; Doesn't parse // string hex = "bac123"; Parses string hex = "bacg123"; long output; long.TryParse(hex, System.Globalization.NumberStyles.HexNumber, null, out output);
我习惯Int32.TryParse()
这样做. 这是MSDN页面.
这是上面yjerem解决方案的LINQ版本:
private static bool IsValidHexString(IEnumerablehexString) { return hexString.Select(currentCharacter => (currentCharacter >= '0' && currentCharacter <= '9') || (currentCharacter >= 'a' && currentCharacter <= 'f') || (currentCharacter >= 'A' && currentCharacter <= 'F')).All(isHexCharacter => isHexCharacter); }
怎么样:
bool isHex = text.All("0123456789abcdefABCDEF".Contains);
这基本上说:检查text
字符串中的所有字符是否确实存在于有效的十六进制值字符串中.
对我来说哪个是最简单的可读解决方案.
(别忘了添加using System.Linq;
)
编辑:
刚刚注意到Enumerable.All()
只有.NET 3.5才可用.