분할 기능을 사용하지 않고 버전 번호 비교


124

버전 번호는 어떻게 비교합니까?

예를 들면 :

x = 1.23.56.1487.5

y = 1.24.55.487.2


4
결과가 무엇을 원하십니까?
BoltClock

4
5 개의 부품이있는 버전? 일반적인 4 부분 버전을 사용하는 경우 버전을 비교하고 버전 문자열을 구문 분석하는 메서드가 포함 된 System.Version 클래스를 사용할 수 있습니다
psousa

1
x와 y의 유형은 무엇입니까?
Gleno 2011 년

5
누군가가 말한다 때마다 "사용하지 마십시오 X, Y또는 Z, 항상 나를 왜 궁금합니다." split기능 을 사용하지 않는 이유는 무엇 입니까? 이 split함수는 System.Version클래스 를 사용하지 않을 경우이를 수행하는 좋은 방법 인 것 같습니다 .
Bob2Chiv 2011 년

답변:


294

Version 클래스를 사용할 수 있습니까?

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

IComparable 인터페이스가 있습니다. 이것은 당신이 보여준 것과 같은 5 부분 버전 문자열에서는 작동하지 않을 것입니다 (정말 당신의 버전 문자열입니까?). 입력이 문자열이라고 가정하면 다음은 일반 .NET 4 부분 버전 문자열을 사용한 작업 샘플입니다.

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
버전이 2-4 부분으로 구성된 경우에만
사용자 이름

@dev_Boston 단 하나의 예외 ...이 값 v1 = 1.0001 및 v2 = 1.1.
Sankar M

8
예, 버전 문자열은 10 진수 문자열이 아니며 버전 번호의 일부에 0을 추가하는 것은 관련이 없습니다. 즉, "00001"은 버전 문자열의 두 번째 부분에서 "1"과 같습니다.
JohnD 2011 년

8
가 구현 Version.Parse(v1) < Version.Parse(v2)되었기 때문에 보다 읽기 쉽게 비교할 수 있습니다 operator >(Version v1, Version v2).
Andrey Moiseev

Version.Parse ( "6.0.0")는 Version.Parse ( "6.0.0.0")보다 작습니다 (즉 같지 않음). Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
adospace

13

major.minor.build.revision 체계로 살 수 있다면 .Net Version 클래스를 사용할 수 있습니다 . 그렇지 않으면 왼쪽에서 오른쪽으로 일종의 파싱을 구현하고 차이가 있거나 두 버전이 동일하다는 것을 반환 할 때까지 계속해야합니다.


7

@JohnD의 답변 외에도 Split ( '.') 또는 기타 문자열 <-> int 변환 부풀림을 사용하지 않고 부분 버전 번호 만 비교할 필요가있을 수 있습니다. 1 개의 추가 인수 (비교할 버전 번호의 중요한 부분 수 (1과 4 사이))를 사용하여 확장 메서드 CompareTo를 작성했습니다.

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
이가 같음을 반환 조심하십시오compareVersion("1.3", "1.3.1")
오즈 Ozcitak

1

어떤 이유로 버전의 비교 방법을 직접 사용할 수없는 경우 (예 : 클라이언트-서버 시나리오에서) 다른 방법은 버전에서 긴 숫자를 추출한 다음 서로 비교하는 것입니다. 그러나 번호는 Major, Minor 및 Revision의 경우 2 자리, Build의 경우 4 자리 형식이어야합니다.

버전 번호를 추출하는 방법 :

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

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

그리고 다른 곳에서 비교할 수 있습니다.

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

참고 : installedVersion은 이전에 추출 된 긴 숫자입니다.


모든 숫자 3 개의 장소를 제공하기 위해, 코드는 실제로해야한다 "version.Major * 1000000000L + version.Minor * 1000000L + version.Build * 1000L + version.Revision"
스테프 Heyenrath

1
@StefHeyenrath 맞습니다. 위의 코드를 자신의 필요에 맞게 자유롭게 조정하십시오.
Fabian Bigler 2018 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.