C # 8 सरणी-स्लाइसिंग सुविधा से नया हैट-ऑपरेटर इंडेक्स 0 पर क्यों शुरू नहीं होता है?


156

C # 8.0 स्लाइस एरेज़ का एक सुविधाजनक तरीका पेश करता है - आधिकारिक C # 8.0 ब्लॉगपोस्ट देखें

किसी सरणी के अंतिम तत्व तक पहुंचने का सिंटैक्स है

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

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

मैं सोच रहा हूं कि तत्वों को पीछे की ओर ले जाने के लिए अनुक्रमण 0 के बजाय 1 पर क्यों शुरू होता है? क्या इसका कोई तकनीकी कारण है?


11
ध्यान दें कि C ++ रेंज भी हैं [beginInclusive, endExclusive)। यह एक आम सम्मेलन है।
19 को bommelding

3
@Sinatr: उस ब्लॉग पोस्ट के आधार पर, सब कुछ वापस करने के लिए वाक्यविन्यास होगा value[0..^0], क्योंकि अंत सूचकांक अनन्य है (जो कि अन्य भाषाओं में भी सबसे अधिक काम करता है)। इसके अलावा, आसानी से, value[^i..^0]आप पिछले iआइटम दे देंगे ।
ब्लूराजा - डैनी पफ्लुगुएफ़्ट '

1
@bommelding: C ++ rbegin()उस धारणा से कुछ हद तक असहमत है - उस सीमा से बाहर पहला आइटम या तो एक-से-अंत नहीं है। ;-)
DevSolar

1
ओह कूल, यह अजगर में नकारात्मक अनुक्रमण के बराबर दिखता है:value[-1] # 13
cs95

1
@coldspeed और रूबी में अजगर के समान। मुझे लगता है कि वे दोनों पर्ल से इस सम्मेलन को उधार ले रहे हैं।
वेन कॉनरैड

जवाबों:


170

आधिकारिक जवाब

बेहतर दृश्यता के लिए, यहाँ मैड्स टॉर्गेसेन की एक टिप्पणी है जो C # 8 ब्लॉग पोस्ट के इस डिज़ाइन निर्णय को समझाती है :

हमने पायथन का अनुसरण करने का फैसला किया जब यह शुरुआत से और अंत से अंकगणित की बात आती है। 0 पहला तत्व (हमेशा की तरह), और  ^0 "लंबाई" तत्व, यानी अंत में एक सही है। इस तरह से आपको एक सरल रिश्ता मिलता है, जहां शुरुआत से ही एक तत्व की स्थिति और अंत से इसकी स्थिति लंबाई के बराबर होती है। x में  ^x आप क्या लंबाई से घटाया है | यदि आप गणित किया था अपने आप को है।

-नई टोपी ( ^) ऑपरेटर के बजाय माइनस ( ) का उपयोग क्यों नहीं करें ? यह मुख्य रूप से पर्वतमाला के साथ करना है। फिर से पायथन और अधिकांश उद्योग को ध्यान में रखते हुए, हम चाहते हैं कि हमारी रेंज शुरुआत में समावेशी हो, अंत में अनन्य हो। आप क्या कहते हैं कि सूचकांक एक सीमा के अंत तक सभी तरह से जाना चाहिए? C # में उत्तर सरल है:  अंत तक 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:]सिंटैक्स के साथ कोई समस्या नहीं है ।
मावलकर

8
@mowwwalker - क्या वह पहले से ही बोली में शामिल नहीं है? "तो पायथन में ... यदि सीमा के अंत की गणना की जाती है, तो आपको 0 में आने के मामले में विशेष तर्क रखने के लिए याद रखने की आवश्यकता है"
डेमियन__न्यूबेलिवर

3
@mowwwalker मैड्स टिप्पणी उन मामलों के बारे में थी जिनमें आपको नहीं पता है कि सूचकांक मूल्य क्या होने वाला है क्योंकि यह किसी तरह से गणना की जाती है। वे कह रहे हैं कि जिस मामले में आप endIndexएक नकारात्मक सूचकांक (यानी अंत से सूचकांक) के रूप में गणना करना चाहते हैं, आपके पास नकारात्मक और सकारात्मक संख्याओं के बीच एक असंतोष होगा क्योंकि 0उस मामले में सही तरीके से काम नहीं होने वाला है। जैसा कि मैंने कहा आप को बदलने के लिए 0द्वारा Noneउस के लिए। इसका अर्थ है कि आपका कोड seq[startIndex:endIndex or None]उदाहरण के लिए दिखना चाहिए । or Noneयदि छोड़ दिया जाना चाहिए endIndexसकारात्मक होने की उम्मीद है।
जियाको अल्जेटा

5
यह देखना अच्छा है कि वे पायथन की गलती को -0 से नहीं दोहरा रहे हैं। उस विशेष मामले को संभालना एक बहुत बड़ी परेशानी है और इसे भूलना बहुत आसान है।
user2357112
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.