সি # তে সর্বাধিক 3 নম্বর সন্ধান করার কোন পদ্ধতি আছে?


100

ম্যাথ.ম্যাক্সের মতো তবে 3 বা প্যারামগুলি লাগে?

ধন্যবাদ


4
এই সংখ্যাগুলি কোথায়? তারা কিভাবে সংরক্ষণ করা হয়?
— কোবি

উত্তর:


144

ঠিক আছে, আপনি কেবল এটি দুটি বার কল করতে পারেন:

int max3 = Math.Max(x, Math.Max(y, z));

আপনি যদি নিজেকে এটি অনেক কিছু করতে দেখেন তবে আপনি সর্বদা আপনার নিজের সহায়ক পদ্ধতি লিখতে পারেন ... আমি আমার কোড বেসে এটি একবার দেখে যথেষ্ট খুশি হব তবে নিয়মিত নয়।

(দ্রষ্টব্য যে এটি অ্যান্ড্রুয়ের লিনকিউ-ভিত্তিক উত্তরের চেয়ে বেশি কার্যকরী হওয়ার সম্ভাবনা রয়েছে - তবে স্পষ্টতই লিনকিউ পদ্ধতির কাছে আপনার কাছে যত বেশি আবেদন রয়েছে তত বেশি উপাদান রয়েছে))

সম্পাদনা: একটি "উভয় বিশ্বের সেরা" পদ্ধতির কোনও উপায়ের নিজস্ব কাস্টম সেট থাকতে পারে:

public static class MoreMath
{
    // This method only exists for consistency, so you can *always* call
    // MoreMath.Max instead of alternating between MoreMath.Max and Math.Max
    // depending on your argument count.
    public static int Max(int x, int y)
    {
        return Math.Max(x, y);
    }

    public static int Max(int x, int y, int z)
    {
        // Or inline it as x < y ? (y < z ? z : y) : (x < z ? z : x);
        // Time it before micro-optimizing though!
        return Math.Max(x, Math.Max(y, z));
    }

    public static int Max(int w, int x, int y, int z)
    {
        return Math.Max(w, Math.Max(x, Math.Max(y, z)));
    }

    public static int Max(params int[] values)
    {
        return Enumerable.Max(values);
    }
}

এইভাবে আপনি অ্যারে তৈরির ওভারহেড ছাড়াই MoreMath.Max(1, 2, 3)বা লিখতে পারেন MoreMath.Max(1, 2, 3, 4), তবে MoreMath.Max(1, 2, 3, 4, 5, 6)আপনি যখন ওভারহেডকে কিছু মনে করেন না তখনও দুর্দান্ত পঠনযোগ্য এবং ধারাবাহিক কোডের জন্য লিখতে পারেন।

আমি লিনকিউ পদ্ধতির সুস্পষ্ট অ্যারে তৈরির চেয়ে ব্যক্তিগতভাবে এটিকে আরও পঠনযোগ্য বলে মনে করি ।


4
আপনি যদি এই জাতীয় কোনও প্রশ্ন জিজ্ঞাসা করেন তবে সর্বাধিক ফাংশনের কার্য সম্পাদন সম্ভবত অপ্রাসঙ্গিক এবং পাঠযোগ্যতা বিরাজ করবে।
— বাস

4
@ অ্যান্ড্রু: আমি মনে করি এক জায়গায় পড়া ঠিক আছে । আমার যদি এটি একাধিকবার (তবে এখনও প্রতিবার 3 টি পরামিতি সহ) থাকে তবে আমি সম্ভবত লিনকিউ পদ্ধতির ব্যবহারের চেয়ে কাস্টম পদ্ধতিটি লিখতাম। MoreMath.Max(x, y, z)আইএমও-র লাইনকিউ পদ্ধতির চেয়ে আরও বেশি পঠনযোগ্য।
— জন স্কিটি

আপনি শুধু ব্যবহার করেন না কেন public static int Max(params int[] values) ?
— নাভিদ রহমানি

4
@ নাভিড: কারণ এটিকে কল করা অকারণে Max(1, 2, 3)অ্যারে তৈরি করবে। অপেক্ষাকৃত কম সংখ্যক প্যারামিটারের জন্য কয়েকটি ওভারলোড সরবরাহ করে, আপনি কলারের পাঠযোগ্যতার উপর প্রভাব না ফেলে এটিকে আরও দক্ষ করে তুলতে পারেন।
— জন স্কিটি

ম্যাথ.ম্যাক্স আপনি নিজের কোডটি অপ্টিমাইজ না করা পর্যন্ত ধারাবাহিকভাবে আরও ভাল পারফরম্যান্স বলে মনে হচ্ছে, আমরা 2 -> 3 -> 4 থেকে এগিয়ে যাওয়ার সাথে সাথে সিড সঙ্কুচিত হয়ে যায়, এমনকি মোরথ ম্যাথও যোগ করে M ম্যাক্স (x, y) একটি পরিমাপযোগ্য ওভারহেড incures। ম্যাথ.ম্যাক্স ~ (1,2) 43ms, (2,1) ~ 38ms, ইনলাইনড ~ (1,2) 58ms, (2,1) ~ 53ms, ডেলিগেটেড De (1,2) 69ms, (2,1) Ms 61ms। -> 3 মানগুলিতে গণিত: ~ 55ms, ইনলাইনড: ~ 62ms। -> 4 টি মান: ms 75ms বনাম ms 80ms ... সমস্ত 10 মিলিয়ন পুনরাবৃত্তি এবং 5 টি পরিমাপের দ্বারা সম্পন্ন ... আপনি যদি অপ্টিমাইজেশান চালু করেন তবে প্রবণতাটি পাল্টে যায় এবং ম্যাথ আরও বেশি মান যুক্ত করলে আপনি জয়ী হন। তবে ... পারফরম্যান্স ম্যাটার হওয়ার আগে আপনার কয়েক বিলিয়ন তুলনা দরকার।
— জেনস

154

আপনি ব্যবহার করতে পারেন Enumerable.Max:

new [] { 1, 2, 3 }.Max();

4
আমি জানতাম না যে আপনি এটির সাথে একটি পরিমান তৈরি করতে পারেন []। নিফটি
— মতিন উলহাক

7
@ ম্যাটেন উলহাক এটির জন্য স্বল্প হাত new int[] { 1,2,3 }। সুতরাং এটি টাইপ ইন্টের একটি অ্যারে, যা এর বিষয়বস্তু দ্বারা স্পষ্টভাবে নির্ধারিত হয়।
— মিক্স্সিফয়েড

30

লিনকের একটি সর্বাধিক ফাংশন রয়েছে।

আপনার যদি থাকে তবে আপনি IEnumerable<int>এটিকে সরাসরি কল করতে পারেন, তবে পৃথক প্যারামিটারগুলিতে আপনার যদি এটির প্রয়োজন হয় তবে আপনি এটির মতো একটি ফাংশন তৈরি করতে পারেন:

using System.Linq;

...

static int Max(params int[] numbers)
{
    return numbers.Max();
}

তারপরে আপনি এটিকে এটি কল করতে পারেন:, এটি max(1, 6, 2)প্যারামিটারগুলির একটি স্বেচ্ছাসেবী সংখ্যার জন্য অনুমতি দেয়।


4
হ্যাঁ, আমার সম্পাদিত উত্তর অনুসারেও ... আমি অবশ্যই এটিকে কল Maxকরার চেয়ে বরং maxএটি স্থিতিশীল করতে চাইব :) কম প্যারামিটারের জন্য এটি ওভারলোড করে, আপনি এটি আরও দক্ষ করে তুলতে পারেন।
— জন স্কিটি

4
@ জোন স্কিটি: আমাদের কি আসলেই এইরকম একটি লাইনারের জন্য ফাংশন লিখতে হবে?
— নবীন

5
@ নবীন: অবশ্যই, যদি এটি কোডটি আরও পরিষ্কার করে দেয় এবং আপনি এটি একাধিক জায়গায় ব্যবহার করছেন। কেন না?
— জন স্কিটি

@ জোন স্কিটি: স্পষ্ট করার জন্য ধন্যবাদ। এটি আমার নকশা সন্দেহ ছিল দীর্ঘকাল ধরে। করতে বা না করতে :)
— নবীন


8

বিষয় ছাড়াই তবে এখানে মধ্যমূল্যের সূত্রটি দেওয়া আছে .. ঠিক যদি কেউ এর সন্ধান করে

Math.Min(Math.Min(Math.Max(x,y), Math.Max(y,z)), Math.Max(x,z));

3

আসুন ধরে নেওয়া যাক List<int> intList = new List<int>{1,2,3}আপনি করতে পারেন এমন সর্বোচ্চ মূল্য পেতে চাইলে আপনার কাছে একটি রয়েছে

int maxValue = intList.Max();

1

যদি, যে কোনও কারণেই (যেমন স্পেস ইঞ্জিনিয়ার্স এপিআই), System.array এর সর্বাধিক সংজ্ঞা নেই বা আপনার অগণনীয় অ্যাক্সেস নেই, সর্বাধিক n মানগুলির সমাধান:

public int Max(int[] values) {
    if(values.Length < 1) {
        return 0;
    }
    if(values.Length < 2) {
        return values[0];
    }
    if(values.Length < 3) {
       return Math.Max(values[0], values[1]); 
    }
    int runningMax = values[0];
    for(int i=1; i<values.Length - 1; i++) {
       runningMax = Math.Max(runningMax, values[i]);
    }
    return runningMax;
}

0

আপনি এই কোড চেষ্টা করতে পারেন:

private float GetBrightestColor(float r, float g, float b) { 
    if (r > g && r > b) {
        return r;
    } else if (g > r && g > b) { 
        return g;
    } else if (b > r && b > g) { 
        return b;
    }
}

সংখ্যাগুলি সমান হলে এটি কোনও কিছুই ফিরিয়ে দেবে না।
— জুলুব্রোস 20

0

মূল্যমূল্যে সর্বাধিক উপাদানের মান [] হ'ল সর্বাধিক দামের মূল্য:

double[] priceValues = new double[3];
priceValues [0] = 1;
priceValues [1] = 2;
priceValues [2] = 3;
double maxPriceValues = priceValues.Max();

0

এই ফাংশনটি পূর্ণসংখ্যার অ্যারে নেয়। (অ্যারে পাঠানোর বিষয়ে @ জোন স্কিটের অভিযোগ আমি পুরোপুরি বুঝতে পারি))

এটি সম্ভবত কিছুটা ওভারকিল।

    public static int GetMax(int[] array) // must be a array of ints
    {
        int current_greatest_value = array[0]; // initializes it

        for (int i = 1; i <= array.Length; i++)
        {
            // compare current number against next number

            if (i+1 <= array.Length-1) // prevent "index outside bounds of array" error below with array[i+1]
            {
                // array[i+1] exists
                if (array[i] < array[i+1] || array[i] <= current_greatest_value)
                {
                    // current val is less than next, and less than the current greatest val, so go to next iteration
                    continue;
                }
            } else
            {
                // array[i+1] doesn't exist, we are at the last element
                if (array[i] > current_greatest_value)
                {
                    // current iteration val is greater than current_greatest_value
                    current_greatest_value = array[i];
                }
                break; // next for loop i index will be invalid
            }

            // if it gets here, current val is greater than next, so for now assign that value to greatest_value
            current_greatest_value = array[i];
        }

        return current_greatest_value;
    }

তারপরে ফাংশনটি কল করুন:

int highest_val = GetMax (new[] { 1,6,2,72727275,2323});

// highest_val = 72727275
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.