কীভাবে 2 তালিকা <টি> মার্জ করবেন এবং এটি থেকে নকল মানগুলি মুছে দিন # #


159

আমার দুটি তালিকাগুলি রয়েছে যা আমার তৃতীয় তালিকায় একত্রিত করতে হবে এবং সেই তালিকা থেকে সদৃশ মানগুলি সরিয়ে ফেলতে হবে

কিছুটা ব্যাখ্যা করা শক্ত, সুতরাং কোডটি দেখতে কেমন এবং এর ফলস্বরূপ আমি কী চাই তার একটি উদাহরণ দেখি, নমুনায় আমি রেজাল্ট অ্যানালাইসিসফাইলেএসএইচএল ক্লাস নয় ইনট টাইপ ব্যবহার করি।

প্রথম তালিকা = [1, 12, 12, 5]

সেকেন্ড_লিস্ট = [12, 5, 7, 9, 1]

দুটি তালিকার সংমিশ্রণের ফলাফলের এই তালিকাতে ফলাফল হওয়া উচিত: ফলাফল_ তালিকা = [1, 12, 5, 7, 9]

আপনি লক্ষ্য করবেন যে ফলাফলটির প্রথম তালিকা রয়েছে যার দুটি "12" মান রয়েছে, এবং দ্বিতীয়_ তালিকায় অতিরিক্ত 12, 1 এবং 5 মান রয়েছে।

রেজাল্ট অ্যানালাইসিসফাইএসএইচএল ক্লাস

[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
@ ডিআর টিজে: আপনার ব্যক্তি শ্রেণি কি আইক্যুয়ালিটি কম্প্যাকার <টি> প্রয়োগ করে? যদি তা হয় তবে আপনার গেটহ্যাশকোড এবং সমান পদ্ধতিগুলি পরীক্ষা করতে হবে। এমএসডিএন.মাইক্রোসফটকম /en-us/library/bb341731.aspx এর মন্তব্যসমূহ বিভাগটি দেখুন ।
টমাস ন্যারোস

1
গুরুত্বপূর্ণ লক্ষণীয় কারণ আমি এটি 2 টি পৃথক সংকলনে ব্যবহার করে সমস্যায় পড়েছি: "আপনি দুটি ভিন্ন ধরণের সংঘবদ্ধ করতে পারবেন না, যদি না একজনের কাছ থেকে অন্যটির উত্তরাধিকার সূত্রে প্রাপ্ত হয়" " যা cannot be inferred from the usageত্রুটি পেয়েছিল a
এটকনওয়ে


25

ইউনিয়নের ভাল পারফরম্যান্স নেই: এই নিবন্ধটি তাদের একসাথে তুলনা সম্পর্কে বর্ণনা করে

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

তালিকা এবং লিনকিউ একত্রীকরণ: 4820 মিমি
অভিধানের মার্জ: 16
মিমি
হ্যাশসেট এবং আইক্যালিটি কম্পিউটার: 20 মিমি লিনকউ ইউনিয়ন এবং আইক্যুয়ালিটি কম্পিউটার: 24 মিমি


1
এছাড়াও অভিধান মার্জ ব্যবহারের আরেকটি সুবিধা -> আমার কাছে ডিবি ডেটা থেকে ফিরে আসা দুটি তালিকা রয়েছে। এবং আমার ডেটাতে টাইমস্ট্যাম্প ক্ষেত্র রয়েছে যা তথ্য দুটি তালিকার চেয়ে আলাদা। টাইমস্ট্যাম্প আলাদা হওয়ার কারণে ইউনিয়নের সাথে আমি সদৃশগুলি পাই। তবে সংশ্লেষের সাথে আমি সিদ্ধান্ত নিতে পারি যে অভিধানে আমি কোন অনন্য ক্ষেত্রটি বিবেচনা করতে চাই। +1
জিমসান

প্রসেসরের গতি অনুসারে পরিবর্তিত হতে পারে, আপনার কোন ধরণের সিপিইউ নির্ভর করে।
আসাদ আলী

7
এবং নিবন্ধের শেষে বলা আছে, "আমি লিনকুই ইউনিয়নকে পছন্দ করি কারণ এটি উদ্দেশ্যকে খুব স্পষ্টভাবে যোগাযোগ করে।" ;) (এছাড়াও, কেবলমাত্র একটি 8 এমএসের পার্থক্য ছিল)
জেমস উইলকিনস

1
ছোট তালিকার জন্য যেখানে পার্থক্য নগণ্য, Union ক্লিনার এবং আরও পঠনযোগ্য কোডে ফলাফল দেয়। হাইপার-অপটিমাইজ কোডে সময় ব্যয় করা যখন এটি ধীর হয় না তখন রাস্তায় রক্ষণাবেক্ষণের জরিমানা হতে পারে।
elolos


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.