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"));