C # में अधिकतम 3 संख्या ज्ञात करने की एक विधि है?


99

मैथ.मैक्स की तरह लेकिन इंट के 3 या पारम्स लेता है?

धन्यवाद


3
ये नंबर कहां हैं? वे कैसे संग्रहीत हैं?
कोबी

जवाबों:


141

ठीक है, आप इसे केवल दो बार कॉल कर सकते हैं:

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

यदि आप अपने आप को ऐसा करते हुए पाते हैं, तो आप हमेशा अपनी सहायक विधि लिख सकते हैं ... मुझे खुशी होगी कि मैं एक बार अपने कोड बेस में इसे देखूंगा , लेकिन नियमित रूप से नहीं।

(ध्यान दें कि यह एंड्रयू के LINQ- आधारित उत्तर की तुलना में अधिक कुशल होने की संभावना है - लेकिन स्पष्ट रूप से आपके पास जितना अधिक तत्व LINQ दृष्टिकोण है उतना ही आकर्षक है।)

संपादित करें: "दोनों दुनिया के सर्वश्रेष्ठ" दृष्टिकोण किसी भी तरह से कस्टम सेट हो सकते हैं:

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)जब आप ओवरहेड का बुरा नहीं मानते हैं तो अच्छा पठनीय और सुसंगत कोड लिखें ।

मुझे व्यक्तिगत रूप से LINQ दृष्टिकोण के स्पष्ट सरणी निर्माण की तुलना में अधिक पठनीय लगता है ।


2
यदि आप इस तरह का प्रश्न पूछते हैं, तो अधिकतम फ़ंक्शन का प्रदर्शन सबसे अधिक संभावनाहीन है, और पठनीयता प्रबल होगी।
बास

2
@ और: मुझे लगता है कि एक जगह पढ़ना ठीक है। अगर मेरे पास एक से अधिक बार (लेकिन फिर भी हर बार 3 मापदंडों के साथ) था, तो मैं शायद LINQ दृष्टिकोण का उपयोग करने के बजाय एक कस्टम विधि लिखूंगा। MoreMath.Max(x, y, z)LINQ दृष्टिकोण, IMO से भी अधिक पठनीय है।
जॉन स्कीट

आपने सिर्फ उपयोग क्यों नहीं किया public static int Max(params int[] values) ?
रहमानी

2
@ नेवीड: क्योंकि वह कॉलिंग Max(1, 2, 3)बिना किसी कारण के एक सरणी बनाएगी। अपेक्षाकृत कम संख्या में मापदंडों के लिए कुछ अधिभार प्रदान करके, आप कॉलर की पठनीयता को प्रभावित किए बिना इसे और अधिक कुशल बना सकते हैं।
जॉन स्कीट

Math.Max ​​लगातार बेहतर प्रदर्शन करता है जब तक आप अपने कोड को ऑप्टिमाइज़ नहीं करते हैं, यह लीड सिकुड़ता है क्योंकि हम 2 -> 3 -> 4 से जाते हैं, यहां तक ​​कि MoreMath.Max ​​(x, y) को जोड़ने से एक औसत दर्जे का ओवरहेड हो जाता है। Math.Max ​​~ (1,2) 43ms, (2,1) ~ 38ms, इच्छुक ~ (1,2) 58ms, (2,1) ~ 53ms, प्रत्यायोजित ~ (1,2) 69ms, (2,1) ~ 61ms। -> 3 मूल्यों पर गणित: ~ 55ms, इच्छुक: ~ 62ms। -> 4 मान: ~ 75ms बनाम ~ 80ms ... सभी 10 मिलियन पुनरावृत्तियों और 5 मापों द्वारा किया जाता है ... यदि आप अनुकूलन को चालू करते हैं तो प्रवृत्ति बदल जाती है और गणित आपके द्वारा जोड़े गए अधिक मूल्यों को जीतता है। लेकिन ... आपको प्रदर्शन से पहले अरबों तुलनाओं की आवश्यकता होगी।
जेंस

152

आप उपयोग कर सकते हैं Enumerable.Max:

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

2
मुझे नहीं पता था कि आप एक एन्युमरेबल बना सकते हैं []। निफ्टी।
मतीन उलहाक

7
@MateenUlhaq यह शॉर्ट हैंड है new int[] { 1,2,3 }। तो यह एक प्रकार की सरणी है, जो कि इसकी सामग्री द्वारा स्पष्ट रूप से निर्धारित की जाती है।
मिक्सक्सिफ़ॉइड

30

Linq में एक मैक्स फंक्शन है।

यदि आपके पास एक है IEnumerable<int>तो आप इसे सीधे कॉल कर सकते हैं, लेकिन यदि आपको अलग-अलग मापदंडों में इनकी आवश्यकता होती है, तो आप इस तरह से एक फ़ंक्शन बना सकते हैं:

using System.Linq;

...

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

तब आप इसे इस तरह कह सकते हैं: max(1, 6, 2)यह एक अनियंत्रित मापदंडों के लिए अनुमति देता है।


2
हाँ, के रूप में मेरी संपादित जवाब भी प्रति ... सिवाय मैं निश्चित रूप से यह कॉल करने के लिए चाहते हैं Maxके बजाय max, और यह स्थिर :) कम मापदंडों के लिए यह अधिक भार से बनाने के लिए, आप इसे और अधिक भी कुशल बना सकते हैं।
जॉन स्कीट

1
@ जीन स्कीट: क्या हमें वास्तव में इस तरह के एक लाइनर्स के लिए फ़ंक्शन लिखना चाहिए?
नवीन

5
@ नवीन: बिल्कुल, अगर यह कोड को स्पष्ट करता है, और आप इसे कई स्थानों पर उपयोग कर रहे हैं। क्यों नहीं?
जॉन स्कीट

@ जीन स्कीट: स्पष्ट करने के लिए धन्यवाद। यह एक लंबे समय के लिए मेरे पास एक डिज़ाइन संदेह था। करने के लिए या नहीं करने के लिए :)
naveen


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 मैक्स के लिए कोई परिभाषा है और न ही आप Enumerable, के मैक्स के लिए एक समाधान के लिए उपयोग किया 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;
    }
}

यदि नंबर समान हैं तो यह कुछ भी नहीं लौटाएगा।
ज़ुराबोस

0

PriceValues ​​में अधिकतम तत्व मूल्य [] maxPriceValues ​​है:

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

0

यह फ़ंक्शन पूर्णांक की एक सरणी लेता है। (मैं सरण भेजने के बारे में @Jon Skeet की शिकायत को पूरी तरह से समझता हूं।)

यह शायद थोड़ा ज्यादा है।

    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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.