system.version超过3个小数点c#

时间:2018-03-15 12:23:31

标签: c# linq system.version

我目前收到以下错误 - “版本字符串部分太短或太长”

使用此声明时 -

records = records.OrderBy(r => new Version(r.RefNo)).ToList();

订购一个名为RefNo的字符串列表。它在25.1.2.1.2失败,所以我假设它是因为它有四个小数点?因为它适用于3 ....

system.version最多有四个deciaml点吗?

谢谢

3 个答案:

答案 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;
        }