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


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.