【问题标题】:ArgumentException: Version string portion was too short or too longArgumentException:版本字符串部分太短或太长
【发布时间】:2020-03-02 06:26:15
【问题描述】:

我正在从存储为VARCHAR 并具有类似2.6.12-build.222 的值的数据库中获取产品版本。我需要在- 之后修剪所有内容,所以结果是2.6.12 下面是我如何执行此字符串操作并且工作正常的代码,我正在获得修剪版本,但我需要比较两个版本以进行进一步操作为此,我正在使用 Version 类,但是一旦我将子字符串传递给 Version 类,它就会向我显示此错误-

ArgumentException: Version string portion was too short or too long.

我所有的版本都是2.6.12 格式

var resourceGuids = httpResp.Select(xl => xl.guid).ToList();

var existingBuilds = _DBcontext.Deployedproducts.Where(xl => resourceGuids.Contains(xl.Guid.ToString())).ToList();

var x = existingBuilds.FirstOrDefault(o => o.Guid == item.guid);

Version v = new Version(x.ProductVersion.Substring(0, x.ProductVersion.LastIndexOf("-") + 1).Replace(@"-",""));

if (item.Item1.version < v)
{
    x.LatestMajorRelease = item.Item1.version.ToString();
}

【问题讨论】:

  • 去掉Substring中的+ 1,你就不需要Replace了。但是请注意,如果没有破折号,您的代码将生成一个空字符串。
  • 哦,不,我不能这样做,有些版本没有任何破折号,所以它会返回空字符串
  • 如果有一些没有破折号,那么你需要检查LastIndexOf 是否返回-1,在这种情况下你根本不想做子字符串。
  • 您的问题是,如果没有破折号,您正在尝试从空字符串创建Version,因此会出现关于没有足够部分的错误。它需要 2 到 4 个以句点分隔的数字。
  • 哦,现在我明白了

标签: c# asp.net-core


【解决方案1】:

如果你可以有没有破折号的值,你必须在执行子字符串之前检查它。

string version = x.ProductVersion;
int dashIndex = x.ProductVersion.IndexOf("-");
if(dashIndex > -1)
    version = version.Substring(0, dashIndex);

Version v = new Version(version);

请注意,我使用IndexOf 以防万一以后有第二次破折号。

您还可以进行其他检查,例如 dashIndex 是否为 0,那么这将导致一个空字符串,因为它可能是一个无效的版本。

事实上,如果dashIndex 小于 3,那么它就不是有效版本(因为该版本需要至少 2 个部分,例如 1.1 或 2.3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2016-10-27
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多