c# - सूची में डुप्लिकेट वैल्यू को निकालने का सबसे तेज़ तरीका<>lambda द्वारा




list c#-4.0 generic-list (7)

यदि आप एक नया निर्माण करने के बजाय मूल सूची के साथ रहना चाहते हैं, तो आप अलग- Distinct() एक्सटेंशन विधि आंतरिक रूप से क्या कर सकते हैं, यानी विशिष्टता की जांच के लिए हैशसेट का उपयोग करें:

HashSet<long> set = new HashSet<long>(longs.Count);
longs.RemoveAll(x => !set.Add(x));

सूची वर्ग इस सुविधाजनक RemoveAll(predicate) विधि प्रदान करता है जो सभी तत्वों को भविष्यवाणी द्वारा निर्दिष्ट शर्त को संतुष्ट नहीं करता है। भविष्यवाणी एक प्रतिनिधि है जो सूची के तत्व प्रकार का पैरामीटर लेती है और एक बूल मान लौटाती है। हैशसेट की Add() विधि केवल तभी सत्य होती है जब सेट में अभी तक आइटम नहीं है। इस प्रकार सूची से किसी भी आइटम को हटाकर जिसे सेट में जोड़ा नहीं जा सकता है, आप प्रभावी रूप से सभी डुप्लिकेट को हटा देते हैं।

सूची से डुप्लिकेट मानों को हटाने का सबसे तेज़ तरीका क्या है। List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 }; इसलिए मैं डुप्लिकेट को हटाने के लिए लैम्ब्डा का उपयोग करने में रूचि रखता हूं और लौटाता हूं: {1, 2, 3, 4, 5} । आपका क्या सुझाव है?


एक नई सूची पाने का सबसे आसान तरीका होगा:

List<long> unique = longs.Distinct().ToList();

क्या यह आपके लिए पर्याप्त है, या क्या आपको मौजूदा सूची को बदलना होगा? उत्तरार्द्ध काफी लंबा हवादार है।

ध्यान दें कि मूल Distinct() को मूल आदेश को संरक्षित करने की गारंटी नहीं है, लेकिन वर्तमान कार्यान्वयन में यह होगा - और यह सबसे प्राकृतिक कार्यान्वयन है। अधिक जानकारी के लिए Distinct() बारे में मेरी एडुलिनक ब्लॉग पोस्ट देखें।

यदि आपको इसकी List<long> होने की आवश्यकता नहीं है, तो आप इसे केवल इस प्रकार रख सकते हैं:

IEnumerable<long> unique = longs.Distinct();

इस बिंदु पर जब भी आप unique फिर से शुरू होते हैं तो यह डी-डुप्लिंग के माध्यम से जाएगा। चाहे वह अच्छा है या नहीं, आपकी आवश्यकताओं पर निर्भर करेगा।


अलग () विधि है। यह काम करना चाहिए।

List<long> longs = new List<long> { 1, 2, 3, 4, 3, 2, 5 };
var distinctList = longs.Distinct().ToList();

एक सरल अंतर्ज्ञानी कार्यान्वयन 'सार्वजनिक स्थैतिक सूची निकालें डुप्लिकेट (सूची सूची बिंदु) {सूची परिणाम = नई सूची ();

        for (int i = 0; i < listPoints.Count; i++)
        {
            if (!result.Contains(listPoints[i]))
                result.Add(listPoints[i]);
        }

        return result;
    }`

List<long> distinctlongs = longs.Distinct().OrderBy(x => x).ToList();

जगह में:

    public static void DistinctValues<T>(List<T> list)
    {
        list.Sort();

        int src = 0;
        int dst = 0;
        while (src < list.Count)
        {
            var val = list[src];
            list[dst] = val;

            ++dst;
            while (++src < list.Count && list[src].Equals(val)) ;
        }
        if (dst < list.Count)
        {
            list.RemoveRange(dst, list.Count - dst);
        }
    }

Enum को int में बदलने के बजाय इसे आज़माएं:

public static class ReturnType
{
    public static readonly int Success = 1;
    public static readonly int Duplicate = 2;
    public static readonly int Error = -1;        
}




c# list c#-4.0 lambda generic-list