2016-07-25 104 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

我認爲如果在週期數不匹配的情況下有'空'條目會失敗。 –