C# 将版本号的单个部分解析为版本类型的最佳方法是什么
上下文:我想将单个部分作为字符串解析为版本类型:C# 将版本号的单个部分解析为版本类型的最佳方法是什么,c#,C#,上下文:我想将单个部分作为字符串解析为版本类型: string lVersionAsString = "6"; 问题:分析只有单个部件的版本号会导致异常: Version lVersion = new Version(lVersionAsString); // Exception 原因:版本类至少需要两个版本部分。例如,值6.1 因此,我尝试了以下简单的解决方案: var lVersionParts = lVersionAsString.Split('.'); if (lVersionPa
string lVersionAsString = "6";
问题:分析只有单个部件的版本号会导致异常:
Version lVersion = new Version(lVersionAsString); // Exception
原因:版本类至少需要两个版本部分。例如,值6.1
因此,我尝试了以下简单的解决方案:
var lVersionParts = lVersionAsString.Split('.');
if (lVersionParts.Length == 1)
{
lVersionAsString += ".0";
}
Version lVersion = new Version(lVersionAsString); // Works
有没有更好的方法?您只需检查数字是否为点格式:
if(!lVersionAsString.Contains("."))
{
lVersionAsString += ".0";
}
您可以使用:
假设字符串大多数时候都有一个有效版本,最好直接解析它,否则只使用回退方法。如果您想确定,还可以使用TryParse
科拉克发表了一篇有趣的文章: 另一个边缘案例:如果lVersionAsString是“6.5.4.3.2”会怎样 这是一种处理这两种情况的方法,它截断了“迷你”版本:
你可以这样写一行
Version lVersion = new Version(lVersionAsString.PadRight(lVersionAsString.Length + lVersionAsString.IndexOf(".") * -1, ".").PadRight(lVersionAsString.Length + lVersionAsString.IndexOf(".") * -1 + 1, "0"));
我喜欢你的方法另一个边缘案例:如果
lVersionAsString
是“6.5.4.3.2”
?@Corak:很好,为了解决这个问题,这些答案有没有帮助你解决问题?如果是这样的话,将一个标记为已接受将是很酷的。Happy coding+1将提供稍好的性能,因为它避免了创建数组对象。等效的lVersion.IndexOf('.')==-1
会更快,尽管您会发现很难测量差异。@Joe这两种方法都是O(n)。但您所说的“+1将提供稍好的性能,因为它避免了创建数组对象”是什么意思?我认为字符串在内部是由字符数组表示的!还是我错了?使用OP的拆分方法作为基线(1.00
),contains的速度要快一些(0.86
),而indexOf的速度要快得多(0.22
)不过,我们仍需要大约纳秒的时间RegEx(静态和编译)不适合较小的字符串(3.51
),虽然一个未编译且总是重新实例化的正则表达式已经过时了…@MongZhu-我想Joe的意思是你的解决方案比OP中的拆分解决方案快,因为拆分创建了一个数组对象。我也注意到了TryParse方法,但你比我快了。非常感谢你的回答。但是单个部件的版本号可以是10
。这不适用于您的代码。
Version lVersion;
while (!Version.TryParse(lVersionAsString, out lVersion) && lVersionAsString.Length > 0)
{
string[] versionTokens = lVersionAsString.Split('.');
if (versionTokens.Length == 1 && !versionTokens[0].All(char.IsDigit)) break; // needed with soemthing like "Foo" as version
lVersionAsString = versionTokens.Length == 1
? lVersionAsString += ".0"
: lVersionAsString.Remove(lVersionAsString.LastIndexOf('.'));
}
Version lVersion = new Version(lVersionAsString.PadRight(lVersionAsString.Length + lVersionAsString.IndexOf(".") * -1, ".").PadRight(lVersionAsString.Length + lVersionAsString.IndexOf(".") * -1 + 1, "0"));