সি # তে এবং রূপান্তরকৃত সমস্তগুলির মধ্যে পার্থক্য


117

আমার কিছু তালিকা রয়েছে:

List<int> list = new List<int> { 1, 2, 3, 4, 5 };

আমি আমার তালিকার উপাদানগুলিতে কিছু রূপান্তর প্রয়োগ করতে চাই। আমি এটি দুটি উপায়ে করতে পারি:

List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();

এই দুটি পদ্ধতির মধ্যে পার্থক্য কী?


16
কনভার্টএল () এর পরে আপনার .ToList () করার দরকার নেই।
গ্লেনো

কনভার্টএল সম্পর্কে কখনও শুনিনি, আজ নতুন কিছু জানতে পেরেছিলেন
অমিত বিশত

উত্তর:


117

Selectএটি একটি লিনকিউ এক্সটেনশন পদ্ধতি এবং সমস্ত IEnumerable<T>অবজেক্টে কাজ করে যেখানে ConvertAllকেবল প্রয়োগ করা হয় List<T>ConvertAll.NET 2.0 থেকে এই পদ্ধতিটি বিদ্যমান রয়েছে যেখানে লিনকিউ 3.5 এর সাথে প্রবর্তিত হয়েছিল।

এটি যে কোনও ধরণের তালিকার জন্য কাজ Selectকরে আপনার পক্ষে উচিত ConvertAll, তবে তারা মূলত একই কাজ করে the


7
এবং পারফরম্যান্স সম্পর্কে কি? আমার যদি একটি তালিকা থাকে তবে কনভার্টএল বা সিলেক্ট করা কি আরও পারফর্মেন্ট?
নিকোলাস

@ নিকোলাস: মোট মৃত্যুদন্ড কার্যকর করার সময় প্রায় একই, তবে তারা প্রক্রিয়াটি আলাদাভাবে করে তাই তারা বিভিন্ন অধিবেশনগুলির জন্য উপযুক্ত। আমি আমার উত্তরে এটি সম্পর্কে কিছু যুক্ত করেছি।
গুফা

3
আপনি তুলনা করতে পারবেন না Selectএবং ConvertAll। প্রাক্তন প্রতিটি আইটেমকে একটি সিকোয়েন্সে নির্বাচন করে এবং আপনি যা চান তা করতে মুক্ত হন। পরেরটির সুস্পষ্ট উদ্দেশ্য রয়েছে: এই আইটেমটিকে অন্য কিছুতে রূপান্তর করুন।
টিম শ্মেলেটার

1
ইন্টারেস্টরিয়ালি, তালিকার <T> শ্রেণিতে কয়েকটি পদ্ধতি রয়েছে যা লিনকুতে প্রায় সঠিক মিল রয়েছে। অস্তিত্ব রয়েছে -> যে কোনও, সন্ধান করুন -> প্রথমে, সন্ধান করুন -> কোথায়, সন্ধান করুন -> সর্বশেষ, ট্রুফোর্ডএল -> সমস্ত
মিকাল

কনভার্টএল এবং সিলেক্টের মধ্যে পার্থক্য হ'ল কনভার্টএল সমস্ত হাতের আগে তালিকার আকার বরাদ্দ করবে। একটি বৃহত ক্রমের জন্য এটি একটি পারফরম্যান্সের পার্থক্য তৈরি করবে। সুতরাং, যদি কর্মক্ষমতা আপনার লক্ষ্য হয় তবে কনভার্টআল ব্যবহার করুন। যদি পারফরম্যান্স কোনও উদ্বেগের বিষয় না হয় তবে সিলেক্টটি ব্যবহার করুন কারণ এটি ভাষাতে আরও মূ .়।
ডারডসফট

82

ConvertAllএটি কোনও এক্সটেনশন নয়, এটি তালিকা শ্রেণীর একটি পদ্ধতি। ToListইতিমধ্যে এটি একটি তালিকা হিসাবে আপনাকে ফলাফলটি কল করতে হবে না :

List<int> list2 = list.ConvertAll(x => 2 * x);

সুতরাং, পার্থক্যটি হল যে ConvertAllপদ্ধতিটি কেবলমাত্র একটি তালিকায় ব্যবহার করা যেতে পারে এবং এটি একটি তালিকা ফেরত দেয়। Selectপদ্ধতি কোনো সংগ্রহ যে কার্যকরী ব্যবহার করা যেতে পারে IEnumerable<T>ইন্টারফেস, এবং এটি একটি ফেরৎ IEnumerable<T>

এছাড়াও, তারা বিভিন্নভাবে প্রক্রিয়াজাতকরণ করে, তাই বিভিন্ন পরিস্থিতিতে তাদের শক্তি রয়েছে। ConvertAllযখন তালিকা মাধ্যমে পদ্ধতি চলে এবং এক বারেই একটি নতুন তালিকা তৈরি করে Selectপদ্ধতি অলস মৃত্যুদন্ড ব্যবহার করে এবং যেমন আপনি তাদের প্রয়োজন শুধুমাত্র আইটেম প্রক্রিয়া করে। আপনার যদি সমস্ত আইটেমের প্রয়োজন না হয় তবে Selectপদ্ধতিটি আরও কার্যকর। অন্যদিকে, একবার ConvertAllতালিকাটি ফিরে আসার পরে, আপনাকে মূল তালিকাটি রাখার দরকার নেই।


যুক্তিযুক্তভাবে, কাউকে কখনই "মূল তালিকাটি রাখতে হবে না": এটি জিসির প্রয়োজন অনুসারে সম্পন্ন হবে।
ব্যবহারকারী 2864740

8
@ ব্যবহারকারী ২6464647৪০: হ্যাঁ, এটি সত্য যদি উত্সটি কঠোরভাবে মেমরির একটি তালিকা থাকে। যদি এটি উদাহরণস্বরূপ কোনও ফাইল থেকে পড়ে থাকে তবে আপনি ফলাফলটি প্রক্রিয়া না করা অবধি আপনার ফাইলটি খোলা রাখা দরকার Select
গুফা

19

প্রথম উত্তরটি গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আমি প্রাক্তন 2007 সি # মাইক্রোসফ্ট এমভিপি।

গৃহীত প্রতিক্রিয়া বিপরীতে, ConvertAllঅনেক সমন্বয় অধিক কার্যকরী হয় Selectএবং ToList()

প্রথমত, ConvertAllকঠোরভাবে দ্রুত এবং এটি মেমরির সর্বনিম্ন পরিমাণ ব্যবহার করে। অ্যারে হিসাবে একই। কনভার্টএল বনাম নির্বাচন করুন এবং ToArray। এটি একটি বৃহত্তর দৈর্ঘ্যের অ্যারে বা লুপের মধ্যে অনেকগুলি কল সহ আরও স্পষ্ট হবে।

1) ConvertAllচূড়ান্ত তালিকার আকারটি জানে এবং বেস অ্যারের পুনরায় স্থানটি এড়ানো যায়। ToList() অ্যারে একাধিকবার আকার পরিবর্তন করতে থাকবে।

2) ToListধীর ইন্টারফেস IEnumerable<>কলগুলি ConvertAllকরবে , যখন অতিরিক্ত কল বা রেঞ্জ চেক ছাড়াই অন্তর্নিহিত অ্যারেটি লুপ করবে।

3) নির্বাচন একটি অতিরিক্ত IEnumerable<T>অবজেক্ট তৈরি করবে ।


1

আমি জানি যে এটি কিছুটা দেরি হয়েছে তবে আমি এখনও যুক্ত করেছি কারণ ভবিষ্যতে এটি অন্যদের জন্য কিছুটা কার্যকর হতে পারে।

এটি ইন্টিফ্রেমওয়ার্ক ক্যোয়ারী এক্সপ্রেশনে ব্যবহার করার সময় কনভার্ট অল () ব্যবহার করার পরামর্শ দেওয়া হয় না কারণ এটি ভবিষ্যতের ব্যবহারের জন্য এক্সপ্রেশন হিসাবে রেখে অভিব্যক্তিটিকে মূল্যায়ন করে। এটি ডেটাবেস ক্যোয়ারী এক্সিকিউশন কার্যকারিতা গুরুতরভাবে হ্রাস করে কারণ চূড়ান্ত ভাব প্রকাশের আগে এটির জন্য অনেকগুলি কল করতে হবে।


9
বেশ না। গুফা যেমন এই উত্তরে উল্লেখ করেছে , ConvertAll এটি একটি পদ্ধতিList<T> । সময় আপনার দ্বারা আছে তালিকা, যদি আপনি ইতিমধ্যেই আপনার অভিব্যক্তি মূল্যায়ন করেছি। তবে আপনি ঠিক বলেছেন - আপনি যদি সমস্ত মূল্যায়ন না করতে চান তবে Selectতার চেয়ে ভাল।
ওয়াই হা লি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.