আইলিস্ট অ্যাডরেঞ্জকে সমর্থন করে না কেন


91

List.AddRange()বিদ্যমান, কিন্তু IList.AddRange()নেই।
এটি আমাকে বিজোড় হিসাবে আঘাত করে। এর পিছনে কারণ কী?

উত্তর:


69

কারণ একটি ইন্টারফেস চিৎকার কার্যকর করতে সহজ হতে পারে এবং "রান্নাঘর ছাড়া সমস্ত কিছু" না থাকে। আপনি যদি যোগ করেন তবে আপনাকে যুক্ত AddRangeকরতে হবে InsertRangeএবং RemoveRange(প্রতিসাম্যের জন্য)। আরও ভাল প্রশ্ন হ'ল কেন IList<T>ইন্টারফেসের মতো ইন্টারফেসের জন্য এক্সটেনশন পদ্ধতি নেই IEnumerable<T>। (জন্য ইন-জায়গা এক্সটেনশন পদ্ধতি Sort, BinarySearch... উপযোগী হতে হবে)


36
@ এসএইচডিএনএক্স, পারফরম্যান্স-ভিত্তিক প্রয়োগের জন্য এগুলি খুব তুচ্ছ নয়। একটি "অভ্যন্তরীণ" AddRange/RemoveRange/InsertRangeসরাসরি "অভ্যন্তরীণ" সংগ্রহের উপর কাজ করতে পারে এবং Capacityপরিচালনাটিকে অনুকূল Array.Copyকরতে পারে এবং ডেটাগুলির ব্লকগুলি ঘুরে দেখার মতো পদ্ধতিগুলি ব্যবহার করতে পারে। একটি এক্সটেনশান পদ্ধতি RemoveRangeসম্ভবত তুলনায় ধীর magniture একটি আদেশ হবেList.RemoveRange
xanatos

4
এটি খুব খারাপ যে কোনও ইন্টারফেসের (যেমন IFoo) কোনও "সহায়ক" নামস্থান নির্দিষ্টকরণ (যেমন ) ঘোষণার জন্য কোনও উপায় ছিল না ( যেমন MyAssembly) যদি কোনও শ্রেণি প্রয়োগের দাবি করে IFooতবে পদ্ধতির অভাব থাকে int Bar(String)তবে সংকলকটি স্বয়ংক্রিয়- উত্পন্ন পদ্ধতি int IFoo.Bar(String p1) {return MyAssembly.ClassHelpers.IFoo.Bar(this, p1);} যদি এ জাতীয় বৈশিষ্ট্যটি উপস্থিত থাকে, তবে ইন্টারফেসে আরও অনেকগুলি পদ্ধতি অন্তর্ভুক্ত AddRangeকরতে পারে যা বেস আচরণের ক্ষেত্রে প্রয়োগ করা যেতে পারে, তবে কিছু বাস্তবায়ন সংশোধন করতে পারে।
সুপারক্যাট

4
এগুলি এক্সটেনশন পদ্ধতি হিসাবে প্রয়োগ করা যেতে পারে, এইভাবে ইন্টারফেস বাস্তবায়ন তাদের প্রয়োগ করতে হবে না। তারা হয় না কেন?
টম পাউরেক

15
এর কোন মানে নেই. একটি ইন্টারফেস একটি বাস্তবায়নকে বিমূর্ত করে তোলে, যাতে একই বেসিক বৈশিষ্ট্যগুলির একাধিক বাস্তবায়ন হতে পারে; ইন্টারফেস থেকে বৈশিষ্ট্যগুলি বাদ দেওয়ার কোনও কারণ নেই কারণ "বাস্তবায়ন শক্ত"। ইন্টারফেসে "অ্যাডরেঞ্জ" এর মতো পদ্ধতি ব্যতীত অন্তর্নিহিত বস্তু তাদের সমর্থন করার কোনও গ্যারান্টি নেই, এবং সেই মুহুর্তে আপনি হয় উপ-অনুকূল এক্সটেনশন বাস্তবায়ন করতে বা বিপজ্জনক অনুমানের চেষ্টা করে ইন্টারফেস ব্যবহারের উদ্দেশ্যকে পরাস্ত করতে বাধ্য হন একটি নির্দিষ্ট প্রয়োগকারী শ্রেণিতে নিক্ষেপ করুন। ডাম্বড-ডাউন ইন্টারফেসগুলি অতিরিক্ত-ব্যবহৃত হয়।
ট্রায়ঙ্কো

4
আইআরঞ্জলিস্ট ইন্টারফেসটি বাল্ক অপারেশনগুলিকে সমর্থনকারী হতে হবে, কেবলমাত্র কয়েকটি সংগ্রহের জন্য প্রয়োগ করা হয়েছে যা অভ্যন্তরীণভাবে বাস্তবায়ন অনুকূল থাকবে।
খুব

10

আইএলিস্টে যারা "অ্যাডরেঞ্জ", "বাছাই করুন", ... এর এক্সটেনশন পদ্ধতি থাকতে চান তাদের জন্য,

নীচে AddRangeএক্সটেনশন পদ্ধতিটি রয়েছে:

 public static void AddRange<T>(this IList<T> source, IEnumerable<T> newList)
 {
     if (source == null)
     {
        throw new ArgumentNullException(nameof(source));
     }

     if (newList == null)
     {
        throw new ArgumentNullException(nameof(newList));
     }

     if (source is List<T> concreteList)
     {
        concreteList.AddRange(newList);
        return;
     }

     foreach (var element in newList)
     {
        source.Add(element);
     }
}

আমি একটি ছোট লাইব্রেরি তৈরি করেছি যা এটি করে। আমি প্রতিটি প্রকল্পে এটির এক্সটেনশন পদ্ধতিগুলি পুনরায় করার চেয়ে আরও কার্যকর বলে মনে করি।

কিছু পদ্ধতি তালিকার চেয়ে ধীর হলেও তারা কাজটি করে।

তাদের আগ্রহের জন্য এখানে গিটহাব রয়েছে:

আইলিস্ট এক্সটেনশন সংগ্রহস্থল ory


আপনি সুন্দর
এলনূর

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