कोई निर्मित "Linqy" जिस तरह से (आप समूह कर सकता है, लेकिन यह बहुत अक्षम हो जाएगा), लेकिन इसका मतलब यह नहीं है कि आप अपने खुद के रास्ते नहीं बना सकते:
public static IEnumerable<T> TakeDistinctByKey<T, TKey>(
this IEnumerable<T> source,
Func<T, TKey> keyFunc,
int count)
{
if (keyFunc == null)
throw new ArgumentNullException("keyFunc");
if (count <= 0)
yield break;
int currentCount = 0;
TKey lastKey = default(TKey);
bool isFirst = true;
foreach (T item in source)
{
yield return item;
TKey key = keyFunc(item);
if (!isFirst && (key != lastKey))
currentCount++;
if (currentCount > count)
yield break;
isFirst = false;
lastKey = key;
}
}
फिर आप इस के साथ यह आह्वान कर सकते हैं:
var items = cache.TakeDistinctByKey(rec => rec.Id, 20);
आप समग्र चाबी या की तरह है कि आप आसानी से उपरोक्त विधि का विस्तार कर सकता है एक तर्क के रूप में एक IEqualityComparer<TKey>
लेने के लिए कुछ भी है, तो।
यह भी ध्यान रखें कि यह कुंजी द्वारा क्रमबद्ध क्रम में तत्वों पर निर्भर करता है।वे नहीं हैं, तो आप या तो एल्गोरिथ्म बदल सकता है ऊपर एक सीधी गणना और अंतिम आइटम तुलना के बजाय एक HashSet<TKey>
उपयोग करने के लिए, या इस के बजाय साथ यह आह्वान:
var items = cache.OrderBy(rec => rec.Id).TakeDistinctByKey(rec => rec.Id, 20);
संपादित करें - मैं भी करना चाहते हैं इंगित करें कि एसक्यूएल में मैं प्रदर्शन की आवश्यकता के आधार पर ROW_NUMBER
क्वेरी या रिकर्सिव सीटीई का उपयोग करता हूं - एक विशिष्ट + जॉइन सबसे प्रभावी विधि नहीं है। यदि आपका कैश क्रमबद्ध क्रम में है (या यदि आप इसे क्रमबद्ध क्रम में बदल सकते हैं) तो ऊपर दी गई विधि स्मृति और निष्पादन समय दोनों के मामले में सबसे सस्ती होगी।
यह बहुत अच्छा है। काम करता है। LINQy। शायद आपके मूल की तुलना में कोई तेज़ नहीं होने वाला, ग्रुपबी के साथ क्या होता है इसके आधार पर धीमा हो सकता है। – David
यह हमेशा मूल की तुलना में थोड़ा धीमा होगा क्योंकि इसे पहली बार पूर्ण पास करना होगा; मूल * * * तत्वों को हिट करते समय रोक सकता है। यदि सूची छोटी है तो शायद कोई बड़ी समस्या नहीं है। – Aaronaught
@Aaronaught: लेकिन मूल को दूसरी क्वेरी में पूर्ण पास करना है, * और * प्रत्येक चरण में 'कंटेन' लुकअप करना है। यह संभावित रूप से एक असली प्रदर्शन हत्यारा हो सकता है। बेशक, निश्चित रूप से जानने का एकमात्र तरीका असली दुनिया के डेटा के साथ बेंचमार्क करना है। – LukeH