सी # में 2 लिस्ट <T> को कैसे मर्ज करें और इससे डुप्लिकेट वैल्यू को हटा दें


159

मेरे पास दो सूचियाँ हैं जिन्हें मुझे तीसरी सूची में संयोजित करने और उस सूचियों से डुप्लिकेट मान निकालने की आवश्यकता है

समझाने में थोड़ा कठिन है, इसलिए मुझे एक उदाहरण दिखाते हैं कि कोड क्या दिखता है और इसके परिणामस्वरूप मैं क्या चाहता हूं, नमूना में मैं intult नहीं ResultAnalysisFileSql वर्ग का उपयोग करता हूं।

पहला_सूची = [१, १२, १२, ५]

दूसरी_सूची = [१२, ५, 12, ९, १]

दो सूचियों के संयोजन का परिणाम इस सूची में होना चाहिए: परिणामस्वरूप_सूची = [1, 12, 5, 7, 9]

आप देखेंगे कि परिणाम में पहली सूची है, जिसमें उसके दो "12" मान शामिल हैं, और दूसरे_सूची में अतिरिक्त 12, 1 और 5 मान हैं।

ResultAnalysisFileSql वर्ग

[Serializable]
    public partial class ResultAnalysisFileSql
    {
        public string FileSql { get; set; }

        public string PathFileSql { get; set; }

        public List<ErrorAnalysisSql> Errors { get; set; }

        public List<WarningAnalysisSql> Warnings{ get; set; }

        public ResultAnalysisFileSql()
        {

        }

        public ResultAnalysisFileSql(string fileSql)
        {
            if (string.IsNullOrEmpty(fileSql)
                || fileSql.Trim().Length == 0)
            {
                throw new ArgumentNullException("fileSql", "fileSql is null");
            }

            if (!fileSql.EndsWith(Utility.ExtensionFicherosErrorYWarning))
            {
                throw new ArgumentOutOfRangeException("fileSql", "Ruta de fichero Sql no tiene extensión " + Utility.ExtensionFicherosErrorYWarning);
            }

            PathFileSql = fileSql;
            FileSql = ObtenerNombreFicheroSql(fileSql);
            Errors = new List<ErrorAnalysisSql>();
            Warnings= new List<WarningAnalysisSql>();
        }

        private string ObtenerNombreFicheroSql(string fileSql)
        {
            var f = Path.GetFileName(fileSql);
            return f.Substring(0, f.IndexOf(Utility.ExtensionFicherosErrorYWarning));
        }


        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;
            if (!(obj is ResultAnalysisFileSql))
                return false;

            var t = obj as ResultAnalysisFileSql;
            return t.FileSql== this.FileSql
                && t.PathFileSql == this.PathFileSql
                && t.Errors.Count == this.Errors.Count
                && t.Warnings.Count == this.Warnings.Count;
        }


    }

संयोजन और डुप्लिकेट को हटाने के लिए कोई नमूना कोड?

जवाबों:


288

क्या आपने Enumerable.Union पर एक नज़र डाली है

यह विधि रिटर्न सेट से डुप्लिकेट को बाहर करती है । यह कॉनैट विधि का अलग व्यवहार है, जो डुप्लिकेट सहित इनपुट अनुक्रमों में सभी तत्वों को वापस करता है।

List<int> list1 = new List<int> { 1, 12, 12, 5};
List<int> list2 = new List<int> { 12, 5, 7, 9, 1 };
List<int> ulist = list1.Union(list2).ToList();

// ulist output : 1, 12, 5, 7, 9

6
@ डीआर टीजे: क्या आपका व्यक्ति क्लास आईईक्वालिटीकंपर <टी> लागू करता है? यदि हां, तो आपको अपने GetHashCode और समान तरीकों की जांच करनी होगी। Msdn.microsoft.com/en-us/library/bb341731.aspx के रिमार्क्स अनुभाग देखें ।
टॉमस नारोस

1
नोट करना महत्वपूर्ण है क्योंकि मैं 2 अलग-अलग संग्रहों पर इसका उपयोग करते हुए मुद्दों में भाग गया: "आप दो अलग-अलग प्रकारों का संघटन नहीं कर सकते, जब तक कि एक दूसरे से विरासत में नहीं मिलता है" stackoverflow.com/a/6884940/410937 से जो एक cannot be inferred from the usageत्रुटि उत्पन्न करता है ।
atconway

30

सिर्फ उदाहरण के लिए क्यों नहीं

var newList = list1.Union(list2)/*.Distinct()*//*.ToList()*/;

ओह ... msdn के अनुसार आप बाहर छोड़ सकते हैं.Distinct()

यह विधि रिटर्न सेट से डुप्लिकेट को बाहर करती है


25

संघ का प्रदर्शन अच्छा नहीं है: इस लेख में उनकी तुलना एक साथ करने के बारे में बताया गया है

var dict = list2.ToDictionary(p => p.Number);
foreach (var person in list1)
{
        dict[person.Number] = person;
}
var merged = dict.Values.ToList();

सूचियाँ और LINQ मर्ज: 4820ms
शब्दकोश मर्ज: 16ms
HashSet और IEqualityComparer: 20ms
LINQ Union और IEqualityComparer: 24ms


1
डिक्शनरी मर्ज का उपयोग करने का एक और लाभ -> मेरे पास डीबी डेटा से वापस आने वाली दो सूची है। और मेरे डेटा में टाइमस्टैम्प फ़ील्ड है, जो डेटा की दो सूचियों में भिन्न है। संघ के साथ मुझे टाइमस्टैम्प अलग होने के कारण डुप्लिकेट मिलते हैं। लेकिन मर्ज के साथ मैं तय कर सकता हूं कि मैं किस विशिष्ट क्षेत्र को शब्दकोश में विचार करना चाहता हूं। +1
जिमसन

प्रोसेसर की गति से भिन्न हो सकते हैं, यह निर्भर करता है कि आपके पास किस प्रकार का सीपीयू है।
असद अली

7
और लेख के अंत में यह कहता है, "मैं LINQ Union को पसंद करता हूं क्योंकि यह बहुत स्पष्ट रूप से इरादे का संचार करता है।" ;) (भी, केवल 8 एमएस का अंतर था)
जेम्स विल्किंस

1
छोटी सूचियों के लिए जहां अंतर नगण्य है, Unionपरिणाम में क्लीनर और अधिक पठनीय कोड है। जब यह धीमा नहीं होता है तो हाइपर-ऑप्टिमाइज़ कोड के लिए समय बिताना सड़क के नीचे एक रखरखाव दंड को लागू कर सकता है।
एलोलोस


11
    List<int> first_list = new List<int>() {
        1,
        12,
        12,
        5
    };

    List<int> second_list = new List<int>() {
        12,
        5,
        7,
        9,
        1
    };

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