C#使用通配符比较两个版本
让我们假设我有两个“版本”的东西。 一个是实际版本(如1.5.2.1) 另一个是如下所示的字符串:1.*或1.5.* 我想验证实际版本的通配符是否为true 为了更好地理解:C#使用通配符比较两个版本,c#,validation,compare,version,wildcard,C#,Validation,Compare,Version,Wildcard,让我们假设我有两个“版本”的东西。 一个是实际版本(如1.5.2.1) 另一个是如下所示的字符串:1.*或1.5.* 我想验证实际版本的通配符是否为true 为了更好地理解: Validation(1.5.2.1,1.*) should be true. Validation(1.5.2.1,1.5.*) should also be true. Validation(1.5.2.1,1.5.1.*) should be false. Validation(2.5.0.0,1.*) should
Validation(1.5.2.1,1.*) should be true.
Validation(1.5.2.1,1.5.*) should also be true.
Validation(1.5.2.1,1.5.1.*) should be false.
Validation(2.5.0.0,1.*) should be false.
Validation(1.5,2.*) should also return true. // This Case breaks all of my attempts.
Validation for "*" only should always be true.
有人能帮我吗?您可以使用
Split
和Zip
组合两个分割的结果并浏览项目:
string value = "1.5.2.1";
string pattern = "1.5.*";
var parts = value.Split('.').Zip(pattern.Split('.'), (valuePart, patternPart) => new { Value = valuePart, Pattern = patternPart });
bool result = true;
foreach (var part in parts)
{
if (part.Pattern == "*")
{
result = true;
break;
}
int p = Int32.Parse(part.Pattern);
int v = Int32.Parse(part.Value);
if (p < v)
{
result = false;
break;
}
else if (p > v)
{
result = true;
break;
}
}
string value=“1.5.2.1”;
字符串模式=“1.5.*”;
var parts=value.Split('.').Zip(pattern.Split('.'),(valuePart,patternPart)=>new{value=valuePart,pattern=patternPart});
布尔结果=真;
foreach(var零件中的零件)
{
如果(part.Pattern==“*”)
{
结果=真;
打破
}
intp=Int32.Parse(part.Pattern);
intv=Int32.Parse(part.Value);
if(pv)
{
结果=真;
打破
}
}
针对更新的问题更新了答案:
public static bool Validation(Version installedVersion, string allowedVersions)
{
var components = new [] {int.MaxValue, int.MaxValue, int.MaxValue, int.MaxValue};
var split = allowedVersions.Split('.');
for (int i = 0; i < split.Length; ++i)
if (split[i] != "*")
components[i] = int.Parse(split[i]);
return installedVersion <= new Version(components[0], components[1], components[2], components[3]);
}
[编辑:稍微简化代码]您能解释一下您的规则并展示您的尝试吗?!我想建立一个许可证检查。在我的许可证文件中,我包含了一个版本字符串,表示我的许可证对版本x(包括Subversion)有效。标准版本.CompareTo(版本2)不允许使用通配符,它只是说版本2等于、大于或小于。我认为如果在句点计数不匹配时存在“空”条目,则该操作将失败。我忘记了其中一种情况,即破坏我所有尝试的情况。如果baseVersion实际上低于VersionCheck,则它也应返回true。验证(1.1,2.*)应返回true。因此,您现在实际上正在更改问题的关键部分。这些更新让你的问题变成了变色龙问题。谢谢@Patrickhoffman和Matthew。我接受马修斯的答案是因为可读性,尽管两者都很好。我不敢相信我没有想到那个简单的解决办法。
Console.WriteLine(Validation(new Version("1.5.2.1"), "1.*")); // True
Console.WriteLine(Validation(new Version("1.5.2.1"), "1.5.*")); // True
Console.WriteLine(Validation(new Version("1.5.2.1"), "1.5.1.*")); // False
Console.WriteLine(Validation(new Version("2.5.0.0"), "1.*")); // False
Console.WriteLine(Validation(new Version("1.1.0.0"), "2.*")); // True
Console.WriteLine(Validation(new Version("2.5.0.0"), "*")); // True