टेबल के केवल एक क्षेत्र के आधार पर लाइनक में डिस्टिंक्ट


133

मैं सारणी के एक क्षेत्र के आधार पर परिणाम प्राप्त करने के लिए लाइनक में .distinct का उपयोग करने की कोशिश कर रहा हूं (ताकि तालिका से संपूर्ण डुप्लिकेट किए गए रिकॉर्ड की आवश्यकता न हो)।

मुझे पता है कि निम्नलिखित के रूप में अलग-अलग का उपयोग करके मूल प्रश्न लिखना:

var query = (from r in table1
orderby r.Text
select r).distinct();

लेकिन मुझे ऐसे परिणामों की आवश्यकता है जहां r.textनकल नहीं हुई है।


आपको यह निर्दिष्ट करना होगा कि आप किस क्षेत्र में विशिष्ट होना चाहते हैं, देखें msdn.microsoft.com/en-us/library/bb348436.aspx
Antarr Byrd

जवाबों:


300

इसे इस्तेमाल करे:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

यह तालिका को समूहीकृत करेगा Textऔर प्रत्येक समूह से पहली पंक्ति का उपयोग करेगा जिसके परिणामस्वरूप पंक्तियाँ Textअलग हैं।


2
क्या होगा यदि ग्रुपबी में 1 से अधिक क्षेत्र हैं?

6
@ user585440: उस स्थिति में, आप एक गुमनाम प्रकार का उपयोग करते हैं जैसे:table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
डैनियल हिल्गारथ

2
हां, आप सही हैं और मैंने पहले ही इसे पा लिया। फिर भी धन्यवाद। और मुझे यह भी पता चलता है कि Select (x => x.First ()) क्रैश का कारण बन सकता है। चयन (x => x.FirstOrDefault ()) में बदलना बेहतर है;

6
मुझे FirstOrDefault का उपयोग करना था या फिर कोई रनटाइम त्रुटि थी
TruthOf42

2
@ TruthOf42 बल्कि इसकी संभावना कम है। GroupByखाली समूह नहीं बनाता है, मेरी पिछली टिप्पणी देखें। सबसे अधिक संभावना है, आपके कोड में आपके द्वारा देखे गए से अधिक है। शायद आप के लिए एक Whereअच्छी तरह से या एक शर्त है First
डैनियल हिल्गारथ

26

MoreLinq में एक विशिष्ट विधि है जिसका आप उपयोग कर सकते हैं:

यह आपको करने की अनुमति देगा:

var results = table1.DistictBy(row => row.Text);

विधि का कार्यान्वयन (तर्क सत्यापन में कमी) इस प्रकार है:

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

क्षमा करें, मैं समानता.कॉम का उपयोग करने का इच्छुक नहीं था।
मेघा जैन

@MeghaJain खैर, एक की परवाह किए बिना इस्तेमाल किया जाएगा, GroupByसाथ ही एक की जरूरत है। EqualityComparerयदि कोई भी प्रदान नहीं किया जाता है तो दोनों विधियां डिफ़ॉल्ट का उपयोग करेंगी ।
सर्व

9
ठीक है, मुझे सही करें अगर मैं गलत हूं, लेकिन यह अलग है स्मृति में किया जाता है, डीबी में नहीं? क्या यह पूर्ण-स्कैन नहीं हुआ है?
केक

@Kek। नहीं, पैदावार वापसी के कारण, आप पहले अलग तत्व पर रुकेंगे। आखिरकार, हां, आप प्रत्येक कुंजी को हैशसेट में लोड करेंगे, लेकिन चूंकि यह IEnumerable है और IEnumerable बाहर है, इसलिए आपको केवल वे आइटम मिलेंगे। अगर आप LINQ से SQL के बारे में बात कर रहे हैं, तो हाँ, यह एक टेबल स्कैन करेगा।
PRMan

12

लेकिन मुझे ऐसे परिणाम चाहिए जहाँ r.text की नकल न हो

लगता है जैसे आप यह चाहते हैं:

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

यह उन पंक्तियों का चयन करेगा जहाँ Textअद्वितीय है।



3

इस विषय को लेकर काफी चर्चाएं हैं।

आप उनमें से एक को यहाँ पा सकते हैं :

सबसे लोकप्रिय सुझावों में से एक है लैंबडा एक्सप्रेशन को एक पैरामीटर के रूप में डिस्टिंक्ट विधि के रूप में @Servy ने बताया है।

सी # के मुख्य वास्तुकार, एंडर्स हेजेल्सबर्ग ने यहां समाधान का सुझाव दिया है । यह भी समझाते हुए कि फ्रेमवर्क डिजाइन टीम ने डिस्टिक्ट विधि के अधिभार को नहीं जोड़ने का फैसला किया जो एक लंबोदर लेता है।


2

मैंने जो पाया है, उसमें से आपकी क्वेरी ज्यादातर सही है। बस "सेलेक्ट आर" को "सेलेक्ट करें। r। टेक्सट" को बदल दें और सभी को समस्या का समाधान करना चाहिए। यह MSDN कैसे काम करता है, यह प्रलेखित है।

उदाहरण के लिए:

    var query = (from r in table1 orderby r.Text select r.Text).distinct();

आपने "चयन" कथन बदल दिया है जो इस मामले में वांछित नहीं हो सकता है
फ़ैज़ा

1
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });

-2

इस कोड को आज़माएं:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

-5

आप यह कोशिश कर सकते हैं:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();

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