2016-07-25 107 views
-3

让我们假设我有两个“版本”的东西。 其中一个是实际版本(例如1.5.2.1)C#使用通配符比较两个版本

另一个是如下所示的字符串:1. *或1.5。*。

我想验证通配符对于实际版本是否为真。

为了更好地理解:

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. 

谁能帮助我?

+0

你可以解释你的规则,并显示你已经尝试?! –

+0

我想构建一个许可证检查。在我的许可证文件中,我包含一个版本字符串,表示我的许可证对版本x有效,包括破坏版。标准版本.CompareTo(版本2)不支持通配符,它​​只是说版本2等于,高于或低于版本2。 – Philip

回答

0
响应更新问题

更新答案:

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

样品测试代码:

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 

[编辑:简化代码s轻轻]

+0

我忘了一个案件,打破了我所有的尝试。如果baseVersion实际上低于versionToCheck,它也应该返回true。验证(1.1.2。*)应该返回true。 – Philip

+0

所以你现在实际上正在改变问题的关键部分。这样的更新使你的问题成为变色龙的问题。 –

+0

@PatrickHofman我知道。我道歉。 – Philip

2

您可以使用SplitZip超过项目将二者结合起来分裂结果,并走:

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

我认为如果在周期数不匹配的情况下有'空'条目会失败。 –