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;
        }
Другие вопросы по тегам