Bölme işlevini kullanmadan sürüm numaralarını karşılaştırın


124

Sürüm numaralarını nasıl karşılaştırırım?

Örneğin:

x = 1.23.56.1487.5

y = 1.24.55.487.2


4
Sonucun ne olmasını istersiniz?
BoltClock

4
5 parçalı bir versiyon? Tipik 4 bölümlü sürümü kullanıyorsanız, sürümleri karşılaştırmak ve sürüm dizesini ayrıştırmak için yöntemler içeren System.Version sınıfını kullanabilirsiniz
psousa

1
X ve y türleri nelerdir?
Gleno

5
Ne zaman biri "Kullanma veya " dediğinde X, nedenini merak ediyorum. Neden işlevi kullanmak istemiyorsunuz ? Fonksiyonu kullanacağız değilse bunu yapmak için iyi bir yol gibi görünüyor sınıfını. YZsplitsplitSystem.Version
Bob2Chiv

Yanıtlar:


294

Sürüm sınıfını kullanabilir misiniz?

http://msdn.microsoft.com/en-us/library/system.version.aspx

IComparable bir arayüze sahiptir. Bunun, gösterdiğiniz gibi 5 parçalı bir sürüm dizesiyle çalışmayacağını unutmayın (bu gerçekten sizin sürüm dizeniz mi?). Girişlerinizin dizeler olduğunu varsayarsak, işte normal .NET 4 parçalı sürüm dizesiyle çalışan bir örnek:

static class Program
{
    static void Main()
    {
        string v1 = "1.23.56.1487";
        string v2 = "1.24.55.487";

        var version1 = new Version(v1);
        var version2 = new Version(v2);

        var result = version1.CompareTo(version2);
        if (result > 0)
            Console.WriteLine("version1 is greater");
        else if (result < 0)
            Console.WriteLine("version2 is greater");
        else
            Console.WriteLine("versions are equal");
        return;

    }
}

5
Yalnızca sürüm 2-4 bölümden oluşuyorsa
kullanıcı adı

@dev_Boston sadece bir istisna ... sadece bu değerleri v1 = 1.0001 ve v2 = 1.1 ile yapın. bana eşit veriyor.
Sankar M

8
Evet, sürüm dizeleri ondalık dizeler değildir ve sürüm numarasının bir kısmının başına sıfır eklemek önemsizdir. Diğer bir deyişle, "00001", sürüm dizesinin 2. bölümünde "1" e eşittir.
JohnD

8
Version.Parse(v1) < Version.Parse(v2)Çünkü operator >(Version v1, Version v2)uygulandığı için daha okunaklı bir şekilde karşılaştırabilirsiniz .
Andrey Moiseev

Version.Parse ("6.0.0") değerinin (<) Version.Parse ("6.0.0.0") değerinden küçük olduğunu unutmayın (yani eşit DEĞİLDİR). Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
adospace

13

Major.minor.build.revision şemasıyla yaşayabilirseniz, .Net Sürüm sınıfını kullanabilirsiniz. Aksi takdirde, soldan sağa bir tür ayrıştırma uygulamanız ve iki sürümün eşit olduğu şeklinde bir fark elde edene veya geri dönene kadar devam etmeniz gerekir.


7

@JohnD'nin cevabına ek olarak, Split ('.') Veya diğer string <-> int dönüşüm bloatını kullanmadan sadece kısmi sürüm numaralarını karşılaştırmak gerekebilir. Karşılaştırma için 1 ek bağımsız değişkenle bir uzantı yöntemi yazdım - karşılaştırılacak sürüm numarasının önemli kısımlarının sayısı (1 ile 4 arasında).

public static class VersionExtensions
{
    public static int CompareTo(this Version version, Version otherVersion, int significantParts)
    {
        if(version == null)
        {
            throw new ArgumentNullException("version");
        }
        if(otherVersion == null)
        {
            return 1;
        }

        if(version.Major != otherVersion.Major && significantParts >= 1)
            if(version.Major > otherVersion.Major)
                return 1;
            else
                return -1;

        if(version.Minor != otherVersion.Minor && significantParts >= 2)
            if(version.Minor > otherVersion.Minor)
                return 1;
            else
                return -1;

        if(version.Build != otherVersion.Build && significantParts >= 3)
            if(version.Build > otherVersion.Build)
                return 1;
            else
                return -1;

        if(version.Revision != otherVersion.Revision && significantParts >= 4)
            if(version.Revision > otherVersion.Revision)
                return 1;
            else
                return -1;

        return 0; 
    }
}

4
public int compareVersion(string Version1,string Version2)
    {
        System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"([\d]+)");
        System.Text.RegularExpressions.MatchCollection m1 = regex.Matches(Version1);
        System.Text.RegularExpressions.MatchCollection m2 = regex.Matches(Version2);
        int min = Math.Min(m1.Count,m2.Count);
        for(int i=0; i<min;i++)
        {
            if(Convert.ToInt32(m1[i].Value)>Convert.ToInt32(m2[i].Value))
            {
                return 1;
            }
            if(Convert.ToInt32(m1[i].Value)<Convert.ToInt32(m2[i].Value))
            {
                return -1;
            }               
        }
        return 0;
    }

14
Bunun eşittir döneceğine dikkat edincompareVersion("1.3", "1.3.1")
Özgür Özgürak

1

Herhangi bir nedenle Sürümün karşılaştırma yöntemini doğrudan kullanmanıza izin verilmiyorsa (örneğin bir istemci-sunucu senaryosunda), başka bir yaklaşım, sürümden uzun bir sayı çıkarmak ve ardından sayıları birbiriyle karşılaştırmaktır. Ancak, numaranın aşağıdaki biçime sahip olması gerekir: Büyük, Küçük ve Revizyon için iki hane ve Oluşturma için dört rakam.

Sürüm numarası nasıl çıkarılır:

var version = Assembly.GetExecutingAssembly().GetName().Version;

long newVersion = version.Major * 1000000000L + 
                   version.Minor * 1000000L + 
                   version.Build * 1000L + 
                   version.Revision;

Ve sonra başka bir yerde karşılaştırabilirsiniz:

if(newVersion > installedVersion)
{
  //update code
}

Not: installVersion önceden ayıklanmış uzun bir sayıdır


Tüm rakamları 3 basamak vermek için, kod aslında şu şekilde olmalıdır: "version.Major * 1000000000L + version.Minor * 1000000L + version.Build * 1000L + version.Revision"
Stef Heyenrath

1
@StefHeyenrath Bu doğru, yukarıdaki kodu kendi ihtiyaçlarınıza göre ayarlamaktan çekinmeyin.
Fabian Bigler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.