【问题标题】:system.version more than 3 decimal points c#system.version 多于 3 个小数点 c#
【发布时间】:2018-03-15 12:23:30
【问题描述】:

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

使用此语句时-

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

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

system.version 的最大四分位数是多少?

谢谢

【问题讨论】:

  • msdn.microsoft.com/en-us/library/… Is the max four deciaml points for system.version? 是的。
  • msdn.microsoft.com/en-us/library/y0hf9t2e(v=vs.110).aspx - 看看备注The version parameter can contain only the components major, minor, build, and revision, in that order, and all separated by periods.
  • 那些不是小数点。小数点是一个. 字符(通常称为“句号”或“句点”)放置在一组数字中,用于将数字的整数部分与小数部分分开。 (在某些其他情况下,小数点可能是逗号,,)。值得注意的是,任何数字包含多个小数点没有意义。
  • 而我试图让人们对此非常清楚的原因是让人们意识到版本3.20与版本3.2不同,并且是比3.9更新的版本。那些表现得好像它是小数分隔符的人(并以某种方式创建了一个规则来忽略后续的.s)最终不理解版本编号。

标签: c# linq system.version


【解决方案1】:

Version 只能有 4 个部分:

主要、次要、构建和修订,按此顺序,并由 期间。

这就是您的方法失败的原因。您可以创建一个扩展方法来处理这种情况,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

【讨论】:

  • 蒂姆,非常感谢您的提示。我将看看如何创建一个扩展方法。
  • @bsod_:在最后的代码中 sn-p 是一个错误,它是:.OrderBy(r =&gt; r.RefNo.TryParseVersion())
【解决方案2】:

见MSDN

构造函数public Version(string version)

包含主要、次要、构建和修订号的字符串, 其中每个数字都用句点字符 ('.') 分隔。

总共有 4 个数字。

表示字符串限制为4个数字,5个导致错误。

同样以int为参数的构造函数只支持1到4个参数。

【讨论】:

    【解决方案3】:

    很抱歉回复晚了,但这是我使用的完成的扩展方法,并进行了一些更改 -

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多