2013-03-11 4 views
7

जब मैं एक IEnumerable से एक DateTime संपत्ति में सबसे अधिक मूल्य के साथ एक वस्तु प्राप्त करना चाहते हैं, मैं निम्नलिखित क्या कर सकते हैं पहले maxDate प्राप्त किए बिना? इस तरह उदाहरण के लिए:यह में से एक में अधिकतम दिनांक समय मान के साथ हो रही वस्तु गुण

var wantedObject = myEnumerable.GetByMaxDate(x => x.TheDateTimeProperty); 

मैं जानता हूँ कि मैं एक विस्तार विधि GetByMaxDate लिख सकता है कि, लेकिन मैं अगर वहाँ पहले से ही LINQ द्वारा प्रदान की एक विधि है जानना चाहते हैं।

बस स्पष्ट करने के लिए: इसे लिखने के लिए अन्य संभावनाओं की तलाश नहीं है। अगर कोई ऐसी विधि मौजूद है जो मुझे करता है तो मुझे बस दिलचस्पी थी। (कम कोड, सबसे अच्छा प्रदर्शन संभव विधि द्वारा प्रबंधित)

+2

आप [morelinq] (https://code.google] का उपयोग कर सकते हैं।कॉम/पी/मोरलिनक /) जॉन स्कीट और इसकी विधि [मैक्सबी] (https://code.google.com/p/morelinq/source/browse/MoreLinq/MaxBy.cs?r=2da75c30d5bda7959e5113b702b4bb204a0e4a2c) – Habib

+0

मैं दूसरी धारणा कि आपको Maxlin विधि से अधिकlinq विधि का उपयोग करना चाहिए। प्रत्येक सी # प्रोग्रामर के टूलबॉक्स में होना चाहिए! –

+0

तो लिनक द्वारा कोई बिल्ड-इन विधि नहीं है, इस बारे में जानकारी के लिए धन्यवाद! –

उत्तर

0

कोई अन्य जवाब आने के बाद से वहाँ जाता है और वहाँ मौजूद नहीं है एक निर्माण में LINQ में विधि, मैं लिख देंगे कि मैं क्या प्रयोग करेंगे।

वस्तुओं के लिए LINQ के लिए:

morelinq से विधि MaxBy के रूप में टिप्पणी में हबीब ने उल्लेख किया।

एसक्यूएल करने के लिए LINQ के लिए:

मैं एक विस्तार विधि लिखेंगे। मैंने कोशिश की, लेकिन निम्न कोड अभी तक काम नहीं कर रहा है। यदि कोई जानता है कि क्या गलत है तो कृपया उत्तर संपादित करें। जब मुझे कुछ समय लगेगा, तो मैं इसे समझने की कोशिश करूंगा।

public static TSource SqlMaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> selector) 
{ 
    var maxValue = source.Max(selector); 
    return source.FirstOrDefault(selector == maxValue); 
} 
10

प्रो: (वस्तुओं, संस्थाओं, एसक्यूएल) यह "किसी भी" LINQ प्रदाता के साथ काम करना चाहिए

myEnumerable.OrderByDescending(x => x.TheDateTimeProperty).First(); 

कोन: के रूप में टिप्पणी में मैथ्यू वाटसन ने बताया , यह (बहुत) बड़ी सूचियों पर प्रदर्शन नहीं करेगा।

+0

प्रदान करता है इसका मुख्य नुकसान यह है कि यह पूरे अनुक्रम की एक प्रति बनाता है, फिर इसे अधिकतम मूल्य प्राप्त करने के लिए टाइप करता है। छोटी सूचियों के लिए ठीक है ... लंबी सूचियों के लिए बहुत बुरा है। –

+0

@ मैथ्यू वाटसन बिल्कुल। सिर्फ एक प्रश्न (यदि आपको जवाब मिल गया है), क्या मैक्सबी सभी linq प्रदाताओं पर काम करता है, जैसे linq इकाइयों के लिए? दिए गए स्रोत कोड के साथ, ऐसा लगता है कि यह गणना करता है, जो ... IQueryable के लिए अच्छा नहीं है। –

+0

बिल्कुल वही नहीं जो मैं खोज रहा था, इससे मुझे परिणाम मिल जाएगा, लेकिन मुझे कोई दिलचस्पी है यदि कोई ऐसा तरीका है जिसका उपयोग मैं कर सकता हूं (अच्छा प्रदर्शन के साथ) –

2

मैं मूल रूप से अधिकतम कहा गया है कि मैं अधिकतम अधिकतम प्राप्त करना पसंद करता हूं। मुझे आपके द्वारा पहले से उपयोग किए गए वाक्यविन्यास का उपयोग करके कोई समस्या नहीं दिखाई दे रही है।

लेकिन अगर आप इस तरह कोड आशुलिपि कर सकते हैं:

var wantedObject = myEnumerable.FirstOrDefault(x => x.TheDateTimeProperty == myEnumerable.Max(x => x.TheDateTimeProperty)); 

(इस कोड का परीक्षण नहीं किया है, हो सकता है कुछ प्रकार कास्टिंग की जरूरत है)

या आप एक संग्रहीत प्रक्रिया लिख ​​सकते हैं और ले जा सकते हैं उस से डेटा।

हालांकि मुझे ऑर्डरबैडसेकिंग पसंद नहीं है। सबसे पहले। यह ठीक है अगर भौतिक रूप से तालिका में आपका डेटा आपकी निर्दिष्ट संपत्ति द्वारा आरोही क्रमबद्ध किया जाता है। लेकिन यदि नहीं, तो आपकी एसक्यूएल तालिका को अवरोही क्रमबद्ध करने की आवश्यकता होगी और शायद इससे अधिक भार प्राप्त होगा। विशेष रूप से जब तालिका में 1 मीटर से अधिक रिकॉर्ड होता है और डेटटाइम भौतिक में आरोही संग्रहीत होता है।

अधिकतम उपयोग कर सकते हैं इसके परिणामस्वरूप बेहतर (तेज/हल्के) परिणाम हो सकते हैं।

+0

मुझे यह पूछने का मतलब नहीं था कि अगर किसी चर में maxDate को सहेजने के बिना कोई दूसरा तरीका है । मैं इसे स्पष्ट करने के लिए अपना प्रश्न संपादित करूंगा। –

+0

हां, मुझे पता है, सिर्फ शॉर्टेंड को अतिरिक्त के रूप में प्रदर्शित करना। मेरी समझ के अनुसार, आपने जो कुछ हासिल किया है वह पहले से ही अच्छा और हल्का है। यदि आप वाक्यविन्यास के साथ अपनी समस्या का वर्णन करते हैं तो हो सकता है कि आप बेहतर उत्तर प्राप्त कर सकें। हालांकि जब आप बेहतर प्राप्त करना चाहते हैं, तो संग्रहीत प्रक्रिया का उपयोग करने पर विचार करें, जहां आप क्वेरी को ट्यून कर सकते हैं या इंडेक्स के साथ सुधार कर सकते हैं। – Fendy

+0

मेरा प्रश्न विशेष रूप से linq-to-sql के बारे में नहीं है, लेकिन अगर कोई इसे इस संदर्भ में चाहता है, तो यह एक अच्छा बिंदु है! –

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