কেন সি # 8 অ্যারে-স্লাইসিং বৈশিষ্ট্যটি থেকে নতুন টুপি অপারেটর সূচকটি 0 থেকে শুরু হচ্ছে না?


156

সি # 8.0 অ্যারেগুলি স্লাইস করার জন্য একটি সুবিধাজনক উপায় উপস্থাপন করেছে - অফিসিয়াল সি # 8.0 ব্লগপোস্ট দেখুন

একটি অ্যারের শেষ উপাদানটি অ্যাক্সেস করার সিনট্যাক্সটি হ'ল

int value[] = { 10, 11, 12, 13 };

int a = value[^1]; // 13
int b = value[^2]; // 12

আমি ভাবছি কেন পিছনের উপাদানগুলিতে অ্যাক্সেসের জন্য সূচকটি 0 এর পরিবর্তে 1 থেকে শুরু হয়? এর কি কারিগরি কারণ আছে?


11
নোট করুন যে সি ++ রেঞ্জগুলিও [beginInclusive, endExclusive)। এটি একটি সাধারণ সম্মেলন।
13:

3
@ সিনাটার: এই ব্লগ পোস্টের উপর ভিত্তি করে, সমস্ত কিছু ফিরিয়ে দেওয়ার সিনট্যাক্স হবে value[0..^0], যেহেতু শেষের সূচকটি একচেটিয়া (অন্য বেশিরভাগ ভাষাগুলিও কীভাবে কাজ করে)। এছাড়াও, সুবিধামতভাবে, value[^i..^0]আপনাকে শেষ iআইটেম দেবে।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

1
@ বম্মেল্ডিং: সি ++ rbegin()কিছুটা এই ধারণার সাথে একমত নয় - এই সীমার বাইরে থাকা প্রথম আইটেমটি শেষের বাইরেও নয়। ;-)
দেবসোলার

1
ওহ দুর্দান্ত, value[-1] # 13
অজগরটিকে

1
@ কোল্ডস্পিড এবং রুবিতে পাইথনের সমান। আমি অনুমান করছি তারা দুজনেই পার্লের কাছ থেকে এই কনভেনশন ধার নিয়েছে।
ওয়েইন কনরাড

উত্তর:


170

সরকারী উত্তর

আরও ভাল দৃশ্যমানতার জন্য, সি # 8 ব্লগ পোস্ট থেকে এই নকশার সিদ্ধান্তটি ব্যাখ্যা করে ম্যাডস টর্গারসেনের একটি মন্তব্য :

শুরু থেকে শুরু থেকে শেষের পাটিগণিতের ক্ষেত্রে পাইথনকে অনুসরণ করার সিদ্ধান্ত নিয়েছিলাম। 0 প্রথম উপাদানটিকে (সর্বদা হিসাবে) এবং  ^0 "দৈর্ঘ্য" উপাদানকে, যেমন শেষের একদম ঠিক করে দেয়। এইভাবে আপনি একটি সহজ সম্পর্ক পাবেন, যেখানে শুরু থেকে কোনও উপাদানের অবস্থান এবং শেষ থেকে তার অবস্থান দৈর্ঘ্যের সমান হয়। x মধ্যে ^x  কি আপনি দৈর্ঘ্য থেকে বিয়োগ হয়ে যেত যদি আপনি গণিত কাজ শেষ করলেন নিজেকে হয়।

-নতুন টুপি ( ^) অপারেটরের পরিবর্তে বিয়োগ ( ) ব্যবহার করবেন না কেন ? এটি প্রাথমিকভাবে রেঞ্জগুলির সাথে সম্পর্কিত। আবার পাইথন এবং বেশিরভাগ শিল্পের সাথে তাল মিলিয়ে আমরা শুরুতে আমাদের রেঞ্জগুলি অন্তর্ভুক্তিকরূপে শুরু করতে চাই। আপনি যে সূচকটিটি বলতে পেরেছেন তা শেষ পর্যন্ত একটি পরিসীমা হওয়া উচিত? সি # তে উত্তরটি সহজ:  শেষ x..^0থেকে xশেষ পর্যন্ত যায়  । পাইথনে, আপনি দিতে পারেন এমন কোনও স্পষ্ট সূচক -0নেই : কাজ করে না, কারণ এটি 0প্রথম উপাদানটির সমান ! তাই পাইথন, আপনি শেষ সূচক বন্ধ ত্যাগ করার সম্পূর্ণরূপে করে এমন একটি ব্যাপ্তি শেষে যাওয়া প্রকাশ করার আছে: x..। যদি পরিসীমাটির শেষ গণনা করা হয়, তবে আপনার যদি মনে হয় এটির ক্ষেত্রে বিশেষ যুক্তি রাখার দরকার আছে 0। যেমন x..-y, কোথায়yগণনা করা হয়েছিল এবং বাইরে এসেছিল 0। এটি বাগের একটি সাধারণ উপদ্রব এবং উত্স।

অবশেষে, লক্ষ করুন যে সূচকগুলি এবং ব্যাপ্তিগুলি .NET / C # তে প্রথম শ্রেণীর প্রকার। তাদের আচরণ যা তারা প্রয়োগ করা হয় তার সাথে বা এমনকি কোনও সূচকগুলিতে ব্যবহার করা যায় না। আপনি সম্পূর্ণরূপে আপনার নিজস্ব সূচক নির্ধারণ করতে পারেন যা সূচি গ্রহণ করে এবং অন্যটি গ্রহণ করে Range- এবং আমরা উদাহরণস্বরূপ যেমন সূচকগুলি যুক্ত করতে যাচ্ছি  Span। উদাহরণস্বরূপ, আপনার কাছে এমন পদ্ধতিও থাকতে পারে যা রেঞ্জ গ্রহণ করে।

আমার উত্তর

আমি মনে করি এটি আমাদের ব্যবহৃত ক্লাসিক সিনট্যাক্সের সাথে মেলে:

value[^1] == value[value.Length - 1]

যদি এটি 0 ব্যবহার করা হয়, তখন দুটি সিনট্যাক্স পাশাপাশি-পাশাপাশি ব্যবহার করা হলে বিভ্রান্তিকর হবে। এইভাবে এটিতে কম জ্ঞানীয় বোঝা রয়েছে।

পাইথনের মতো অন্যান্য ভাষাও একই কনভেনশন ব্যবহার করে।


13
ম্যাডস মন্তব্যে নাবালিক সংশোধন: আপনাকে অজগরে শেষের সূচিটি পুরোপুরি ছেড়ে দিতে হবে না । আপনি ব্যবহার করতে পারেন Noneএকটি সংখ্যা জায়গায়: [0,1,2,3,4][2:None] == [2,3,4]। তবে, হ্যাঁ আপনি শেষ সূচক হিসাবে কোনও পূর্ণসংখ্যার ব্যবহার করতে পারবেন না (স্পষ্টভাবে দৈর্ঘ্যের গণনা ছাড়াই)।
গিয়াকোমো আলজেটা

4
দাঁড়ান .. এতে কী হয়েছে x..? এটি দুর্দান্ত মনে হয় এবং পাইথন [3:]সিনট্যাক্স নিয়ে আমার কখনও সমস্যা হয়নি ।
mowwwalker

8
@ মওওয়ালওয়াকার - ইতিমধ্যে উদ্ধৃতিতে coveredাকা নেই? "সুতরাং পাইথনে ... যদি পরিসীমাটির শেষ গণনা করা হয়, তবে এটি 0 এ চলে আসার ক্ষেত্রে আপনার বিশেষ যুক্তি রাখতে হবে"
ড্যামিয়েন_সে_বিশ্বাসীরা

3
@ মাওওয়ালকার ম্যাডস মন্তব্যটি এমন কেসগুলির বিষয়ে ছিলেন যেখানে আপনি জানেন না যে সূচকের মানটি কী হতে চলেছে কারণ এটি কোনও উপায়ে গণনা করা হয়েছে। তারা বলছে যে ক্ষেত্রে আপনি endIndexনেতিবাচক সূচক হিসাবে গণনা করতে চান (শেষ থেকে সূচক) আপনার নেতিবাচক এবং ধনাত্মক সংখ্যার মধ্যে বিচ্ছিন্নতা হবে কারণ 0সেই ক্ষেত্রে সঠিক উপায়ে কাজ করা যাচ্ছে না। আমি নির্দিষ্ট তোমাদের স্থলাভিষিক্ত করতে হবে 0দ্বারা Noneযে জন্য। এর অর্থ seq[startIndex:endIndex or None]উদাহরণস্বরূপ আপনার কোডটি দেখতে হবে । or Noneবাদ দেওয়া হলে দিতে হবে endIndexইতিবাচক হতে আশা করা হচ্ছে।
গিয়াকোমো আলজেটা

5
তারা পাইথনের ভুলকে -0 জিনিস দিয়ে পুনরাবৃত্তি করছে না তা দেখে ভাল লাগবে। বিশেষ কেসটি পরিচালনা করা একটি বিশাল ঝামেলা এবং ভুলে যাওয়া সহজ উপায় way
ব্যবহারকারী 2357112
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.