system.version более 3 десятичных знаков C#
В настоящее время я получаю следующую ошибку - "Часть строки версии была слишком короткой или слишком длинной"
При использовании этого утверждения -
records = records.OrderBy(r => new Version(r.RefNo)).ToList();
Чтобы заказать список строк называется RefNo. Это не удается на 25.1.2.1.2, поэтому я предполагаю, что это потому, что он имеет четыре десятичных знака? как это работает нормально с 3....
Является ли максимум четыре десятичных точки для system.version?
Спасибо
3 ответа
Version
может иметь только 4 части:
Major, minor, build и revision, в том порядке, и все разделены точками.
Вот почему ваш подход терпит неудачу. Вы можете создать метод расширения, который обрабатывает этот случай, например:
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
Смотрите MSDN
Costructor public Version(string version)
Строка, содержащая основные, вспомогательные номера, номера сборки и редакции, где каждое число ограничено символом точки ('.').
Делает в общей сложности 4 номера.
Означает, что строка ограничена 4 числами, 5 приводят к ошибке.
Также конструкторы с int
В качестве параметров поддерживаются только от 1 до 4 параметров.
Извините за поздний ответ, но вот законченный метод расширения, который я использовал с несколькими изменениями -
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;
}