বিভক্ত ফাংশন ব্যবহার না করে সংস্করণ সংখ্যাগুলির সাথে তুলনা করুন


124

আমি কীভাবে সংস্করণ সংখ্যা তুলনা করব?

এই ক্ষেত্রে:

x = 1.23.56.1487.5

y = 1.24.55.487.2


4
আপনি ফলাফলটি কী চান?
— BoltClock

4
5 অংশ সহ একটি সংস্করণ? আপনি যদি টিপিকাল 4 পার্ট ভার্সন ব্যবহার করে থাকেন তবে আপনি সিস্টেম. ভার্সন ক্লাসটি ব্যবহার করতে পারেন, যার মধ্যে সংস্করণগুলির তুলনা এবং সংস্করণ স্ট্রিংকে বিশ্লেষণের পদ্ধতি রয়েছে
— psousa

1
X এবং y এর প্রকার কি কি?
— গ্লেনো

5
যখনই কেউ বলে "ব্যবহার করবেন না X, Yঅথবা Z", এটা সবসময় আমার ভাবছি কেন করে তোলে। আপনি কেন splitফাংশনটি ব্যবহার করতে চান না ? splitফাংশন একটি ভালো উপায় যদি আপনি ব্যবহার করতে যাচ্ছেন না এই কাজ করতে মত মনে হয় System.Versionবর্গ।
— বব 2 চিভ

উত্তর:


294

আপনি কি সংস্করণ ক্লাস ব্যবহার করতে পারেন?

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

এটির একটি আইকোম্যাপেবল ইন্টারফেস রয়েছে। আপনি যেমন দেখিয়েছেন তেমন এটি 5-অংশের সংস্করণ স্ট্রিংয়ের সাথে কাজ করবে না সচেতন হন (এটি কি সত্যিই আপনার সংস্করণের স্ট্রিং?) আপনার ইনপুটগুলি স্ট্রিং হিসাবে ধরে নিচ্ছেন, এখানে সাধারণ। নেট 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 অংশগুলি থেকে থাকে
— ব্যবহারকারীর নাম

@ দেব_বস্টন কেবল একটি ব্যতিক্রম ... কেবল এই মানগুলি v1 = 1.0001 এবং v2 = 1.1 দিয়ে করুন it এটি আমাকে সমান দেয়।
— শঙ্কর এম

8
হ্যাঁ, সংস্করণটির স্ট্রিংগুলি দশমিক স্ট্রিং নয় এবং সংস্করণ সংখ্যার একটি অংশে শূন্যগুলি অপ্রস্তুত। অন্য কথায়, "00001" সংস্করণ স্ট্রিংয়ের ২ য় অংশে "1" সমান।
— জনডে

8
আপনি আরও স্বাচ্ছন্দ্যের সাথে তুলনা করতে পারেন Version.Parse(v1) < Version.Parse(v2), কারণ operator >(Version v1, Version v2)এটি কার্যকর হয়েছে।
— অ্যান্ড্রে মাইসিয়েভ

সচেতন থাকুন যে সংস্করণ.পার্স ("6.০.০") (<) সংস্করণের তুলনায় কম 6 Debug.Assert(new Version("6.0.0") < new Version("6.0.0.0"));
— অ্যাডস্পেস

13

আপনি যদি মেজর.মিনির.বিল্ড.রিভিশন স্কিমের সাথে বাঁচতে পারেন তবে আপনি নেট সংস্করণ শ্রেণিটি ব্যবহার করতে পারেন । অন্যথায় আপনার কোনও পার্থক্য না হওয়া অবধি বা দুটি সংস্করণ সমান না হওয়া অবধি অবধি চলমান বাম থেকে ডানে এবং অবিরত কিছু প্রকার প্রয়োগ করতে হবে।


7

@ জনডির উত্তর ছাড়াও স্প্লিট ('।') বা অন্যান্য স্ট্রিং </> ইন্ট রূপান্তর ব্লোট ব্যবহার না করে কেবলমাত্র আংশিক সংস্করণ সংখ্যার তুলনা করার প্রয়োজন হতে পারে। আমি মাত্র 1 টি অতিরিক্ত যুক্তির সাথে তুলনা করার জন্য একটি এক্সটেনশন পদ্ধতি লিখেছি - তুলনা করার জন্য সংস্করণ সংখ্যার উল্লেখযোগ্য অংশের সংখ্যা (1 এবং 4 এর মধ্যে)।

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")
— এটির

1

যদি কোনও কারণে আপনাকে সংস্করণটির তুলনা পদ্ধতিটি সরাসরি ব্যবহারের অনুমতি না দেওয়া হয় (উদাহরণস্বরূপ ক্লায়েন্ট-সার্ভারের দৃশ্যে), অন্য পদ্ধতির সংস্করণ থেকে দীর্ঘ সংখ্যা বের করা এবং তারপরে একে অপরের সাথে সংখ্যাগুলি তুলনা করা। তবে, সংখ্যার নিম্নলিখিত ফর্ম্যাটটি থাকা দরকার: মেজর, মাইনর এবং রিভিশন এর জন্য দুটি সংখ্যা এবং বিল্ডের জন্য চারটি অঙ্ক।

সংস্করণ নম্বরটি কীভাবে বের করবেন:

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

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

এবং তারপরে অন্য কোথাও আপনি কেবল তুলনা করতে পারেন:

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

দ্রষ্টব্য: ইনস্টলড ভার্সনটি পূর্বের উত্তোলিত দীর্ঘ সংখ্যা


সমস্ত অঙ্ক 3 টি স্থান দেওয়ার জন্য কোডটি আসলে হওয়া উচিত: "version.Major * 1000000000L + version.Minor * 1000000L + version. বিল্ড * 1000L +
— সংস্করণ। পুনর্বিবেচনা

1
@ স্টেফহিয়ানরথ এটি সঠিক, উপরের কোডটি আপনার নিজের প্রয়োজনের সাথে সামঞ্জস্য করতে নির্দ্বিধায়
— ফ্যাবিয়ান বিগলার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.