我目前收到以下错误 - “版本字符串部分太短或太长”
使用此声明时 -
records = records.OrderBy(r => new Version(r.RefNo)).ToList();
订购一个名为RefNo的字符串列表。它在25.1.2.1.2失败,所以我假设它是因为它有四个小数点?因为它适用于3 ....
system.version最多有四个deciaml点吗?
谢谢
答案 0 :(得分:2)
Version
只能有4个部分:
主要,次要,构建和修订,按此顺序,并且全部分开 周期。
这就是你的方法失败的原因。你可以创建一个处理这种情况的扩展方法,例如:
public static Version TryParseVersion(this string versionString)
{
if (string.IsNullOrEmpty(versionString))
return null;
String[] tokens = versionString.Split('.');
if (tokens.Length < 2 || !tokens.All(t => t.All(char.IsDigit)))
return null;
if (tokens.Length > 4)
{
int maxVersionLength = tokens.Skip(4).Max(t => t.Length);
string normalizedRest = string.Concat(tokens.Skip(4).Select(t => t.PadLeft(maxVersionLength, '0')));
tokens[3] = $"{tokens[3].PadLeft(maxVersionLength, '0')}{normalizedRest}";
Array.Resize(ref tokens, 4);
}
versionString = string.Join(".", tokens);
bool valid = Version.TryParse(versionString, out Version v);
return valid ? v : null;
}
现在您可以这样使用它:
records = records
.OrderBy(r => r.RefNo.TryParseVersion())
.ToList();
使用您的示例,将解析(成功)此新版本字符串:25.1.2.12
答案 1 :(得分:1)
请参阅MSDN
Costructor public Version(string version)
包含主要,次要,构建和修订号的字符串, 其中每个数字用句点字符('。')分隔。
总共有4个数字。
表示字符串限制为4个数字,5表示错误。
int
作为参数的协处理器也只支持1到4个参数。
答案 2 :(得分:0)
对于迟到的回复感到抱歉,但这里是完成的扩展方法,我使用了几个改动 -
public static Version ParseRefNo(this string refNoString)
{
if (string.IsNullOrEmpty(refNoString))
return null;
String[] tokens = refNoString.Split('.');
if (tokens.Length < 2 || !tokens.All(t => t.All(char.IsDigit)))
return null;
if (tokens.Length > 4)
{
int maxVersionLength = tokens.Skip(4).Max(t => t.Length);
string normalizedRest = string.Concat(tokens.Skip(4).Select(t => t.PadLeft(maxVersionLength, '0')));
tokens[3] = $"{tokens[3].PadLeft(maxVersionLength, '0')}{normalizedRest}";
Array.Resize(ref tokens, 4);
}
refNoString = string.Join(".", tokens);
Version v = null;
bool valid = Version.TryParse(refNoString, out v);
return valid ? v : null;
}