system.version多于3位小数c#
system.version more than 3 decimal points c#
我目前收到以下错误 -
"Version string portion was too short or too long"
当使用这个语句时-
records = records.OrderBy(r => new Version(r.RefNo)).ToList();
要订购名为 RefNo 的字符串列表。它在 25.1.2.1.2 上失败所以我认为这是因为它有四个小数点?因为它适用于 3....
system.version 的最大值是 4 个小数点吗?
谢谢
见MSDN
构造函数public Version(string version)
A string containing the major, minor, build, and revision numbers,
where each number is delimited with a period character ('.').
合计 4 个数。
表示字符串限制为4个数字,5个导致错误。
另外,以int
为参数的构造函数只支持1到4个参数。
一个Version
只能有4个部分:
major, minor, build, and revision, in that order, and all separated by
periods.
这就是您的方法失败的原因。您可以创建一个 extension-method 来处理这种情况,f.e.:
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
抱歉回复晚了,但这是我使用的完成的扩展方法,并进行了一些改动 -
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;
}
我目前收到以下错误 - "Version string portion was too short or too long"
当使用这个语句时-
records = records.OrderBy(r => new Version(r.RefNo)).ToList();
要订购名为 RefNo 的字符串列表。它在 25.1.2.1.2 上失败所以我认为这是因为它有四个小数点?因为它适用于 3....
system.version 的最大值是 4 个小数点吗?
谢谢
见MSDN
构造函数public Version(string version)
A string containing the major, minor, build, and revision numbers, where each number is delimited with a period character ('.').
合计 4 个数。
表示字符串限制为4个数字,5个导致错误。
另外,以int
为参数的构造函数只支持1到4个参数。
一个Version
只能有4个部分:
major, minor, build, and revision, in that order, and all separated by periods.
这就是您的方法失败的原因。您可以创建一个 extension-method 来处理这种情况,f.e.:
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
抱歉回复晚了,但这是我使用的完成的扩展方法,并进行了一些改动 -
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;
}