2010-11-12 14 views
7

नमस्कार!LINQ में 'सर्वश्रेष्ठ ले लो' फ़ंक्शन कैसे करें?

मैं उस ऑब्जेक्ट के लिए संग्रह खोजने का एक तरीका ढूंढ रहा हूं जो मेरे मानदंडों को सर्वोत्तम रूप से पूरा करता है। चूंकि मुझे इसे अक्सर करना है, मैं LINQ का उपयोग कर क्वेरी को निष्पादित करने के तरीके में देख रहा था, लेकिन ऐसा करने का एक आसान तरीका नहीं मिल रहा है जो समय बर्बाद करने के लिए 'प्रकट' नहीं होता है।

एक कार्यात्मक कार्यान्वयन होगा:

collection.OrderByDescending(f => FitFunction(f)).First()

लेकिन यह अनावश्यक रूप से छंटाई करने के लिए लगता है। मुझे वास्तव में केवल एक रैखिक स्कैन की आवश्यकता है। न्यूनतम LINQ फ़ंक्शन सबसे अच्छा फिट देता है, ऑब्जेक्ट की बजाय जो सर्वोत्तम फिट बनाता है, और इसलिए उपयोगी प्रतीत नहीं होता है।

स्पष्टता के लिए

, गैर LINQ कोड मैं पारंपरिक रूप से लिखते थे (और इसलिए कई बार किया है):

T best; 
float bestFit = something very low; 

foreach (T ob in collection) 
{ 
    float fit = FitFunction(ob); 
    if (fit > bestFit) 
    { 
    bestFit = fit; 
    best = ob; 
    } 
} 
return best; 

और मुझे लगता है मैं सिर्फ इतना है कि क्या करने के लिए अपने खुद के विस्तार विधि कर सकते हैं; लेकिन मुझे ऐसा लगता है कि पहले ही LINQ के भीतर ऐसा करने का एक तरीका होना चाहिए।

धन्यवाद!

+0

'एफआईटीफंक्शन 'पर' ओबी 'ऑब्जेक्ट को पारित करने के बजाय, क्या आपके पास' ओबी' की संपत्ति के रूप में' फिटफंक्शन 'का नतीजा नहीं हो सकता है, इसलिए' संग्रह 'सक्षम करने के लिए। Min (t => t.FitValue) '? – vlad

+0

@vlad: दुर्भाग्यवश, Enumerable.Min() विधि न्यूनतम मूल्य प्रक्षेपण देता है ... ऑब्जेक्ट इंस्टेंस 't' नहीं, जो ओपी की तलाश में है। यही कारण है कि MoreLINQ ने मिनीबी और मैक्सबी ऑपरेटरों की शुरुआत की। – LBushkin

+0

कठिनाई यह है कि न्यूनतम कार्य 't' के बजाय' t.FitValue' उत्पन्न करेगा। इसके अलावा, यह आवश्यक रूप से फ़िटवैल्यू को ऑब्जेक्ट से जोड़ देगा, जिसे मैं कोड को कम से कम जोड़ना चाहता हूं। –

उत्तर

7

यह अनिवार्य रूप से एक शीर्ष-एन समस्या है जो अतिरिक्त बाधा के साथ भविष्यवाणी के आधार पर है कि एन हमेशा 1 के बराबर है। दुर्भाग्यवश, कोई अंतर्निहित LINQ ऑपरेटर नहीं है जो टॉपन() ऑपरेशन करता है ... लेकिन जैसा कि आप इंगित करते हैं, खुद को लिखना बहुत मुश्किल नहीं है।

MoreLINQ लाइब्रेरी में MaxBy() ऑपरेटर का कार्यान्वयन है, जो आपको भविष्यवाणी निर्दिष्ट करने की अनुमति देता है - और यह भी काम करेगा।

+0

'सिस्टम.इंटरएक्टिव' असेंबली जो प्रतिक्रियाशील एक्सटेंशन (आरएक्स) के साथ आता है, में 'मैक्सबी' का कार्यान्वयन भी है। http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx – bdukes

संबंधित मुद्दे