2012-12-11 15 views
5

यह प्रश्न SO पर एक या अन्य तरीके से पूछा गया है लेकिन ऐसा नहीं है। मैं बस एक बहुत ही बुनियादी मुद्दे पर आया जहां मैं एक संतोषजनक समाधान की तलाश में था :-) मुझे ऑब्जेक्ट्स की एक सूची मिली जिसमें दो पूर्णांक गुण हैं। अब मैं सूची में सभी ऑब्जेक्ट्स के दोनों गुणों का अधिकतम मूल्य खोजना चाहता हूं।सूची में दो (या अधिक) गुणों का अधिकतम मूल्य खोजें

पहले दृष्टिकोण:

int max = Math.Max(list.Max(elem => elem.Nr), list.Max(elem => elem.OtherNr)); 

दूसरा दृष्टिकोण:
मैं तीन समाधान के साथ आया था

public int Max(List<Thing> list) 
{ 
    int maxNr = 0; 

    foreach (var elem in list) 
    { 
    if (elem.Nr > maxNr) 
     maxNr = elem.Nr; 
    if (elem.OtherNr > maxNr) 
     maxNr = elem.OtherNr; 
    } 

    return maxNr; 
} 

एक तीसरा दृष्टिकोण दोनों विशेषता के आधार पर छंटाई करने के लिए किया जाएगा और फिर बस ले पहली प्रविष्टि और एक या दूसरी संपत्ति प्राप्त करें।

मैं ऐसा करने का सबसे तेज़ तरीका ढूंढना चाहता हूं। तो सभी दृष्टिकोणों में से मुझे दूसरी पोस्ट पसंद है (प्रदर्शन दृष्टिकोण से)। भले ही पहला व्यक्ति छोटा हो, आपको सूची में दो बार जाना होगा।

कोई अन्य समाधान?

+1

क्या यह बहुत धीमी है? असल में पहली बार पठनीयता _and_ दक्षता के मामले में मेरे लिए अच्छा लग रहा है। मुझे लगता है कि संरचनात्मक परिवर्तनों के बिना आप इसे तेजी से नहीं प्राप्त करेंगे। –

+0

नहीं, यह नहीं सोच रहा था कि मैं इस – derape

उत्तर

9

आप

int max = list.Max(elem => Math.Max(elem.Nr, elem.OtherNr)); 

यह अभी भी एक एकल लाइनर है, लेकिन केवल दोहराता सूची के माध्यम से एक बार करते हैं। मैं हाथ से बाहर लिखने से दक्षता में संभावित मामूली कमी पर एकल-पंक्तिबद्धता लेता हूं।

(इसके अलावा, आप वहाँ में int कहीं double से एक डाली जरूरत नहीं?)

+0

के लिए सबसे तेज़ एल्गोरिदम क्या सोच रहा हूं, मुझे यह समाधान पसंद है, यह भी बेहतर है और लगभग "हाथ लिखा" जैसा ही होगा – derape

8

एक वैकल्पिक समाधान LINQ का उपयोग कर यदि आप अधिक से अधिक 2 गुण की जरूरत है (जो Math.Max की सीमा है):

int max = list 
    .SelectMany(elem => new[]{ elem.Prop1, elem.Prop2, elem.Prop3 }) 
    .Max(); 
संबंधित मुद्दे