क्या इंडेक्स ऑफ एरे एक्स्ट है


91

मुझे काम पर कुछ कोड विरासत में मिला है जिसमें बहुत बुरी गंध है। मैं सबसे अधिक संभव दर्द रहित समाधान खोजने की उम्मीद कर रहा हूं।

क्या यह जांचने का कोई तरीका है कि क्या कुछ मनमानी संख्या किसी सरणी में एक मान्य तत्व है?

उदाहरण - मुझे यह जाँचने की आवश्यकता है कि क्या सरणी [25] मौजूद है।

अधिमानतः मैं पंक्तियों को खोजने के लिए सरणी के माध्यम से एक फॉर्च्यूनर () किए बिना ऐसा करना पसंद करूंगा।

क्या ऐसा करने का कोई तरीका है, या क्या मैं फॉरच लूप से फंस गया हूं?


क्या आपका मतलब है कि आप जानना चाहते हैं कि सरणी के लिए कुछ मूल्य [x] == 25? मुझे लगता है कि आप लोगों को भ्रमित कर रहे हैं कि आप क्या पूछ रहे हैं कि क्या सरणी [25] मौजूद है। निश्चित रूप से यह मौजूद है अगर सरणी में 26 या अधिक तत्व हैं, लेकिन मुझे नहीं लगता है कि आप क्या पूछ रहे हैं।
केवि .42

मैं जिस कार्यक्रम में काम कर रहा हूं उसमें दो संभावित सरणियाँ हैं जिनका एक ही फ़ाइल नाम है। एक में 21 तत्व होते हैं और दूसरे में 30 सेकंड होते हैं। मुझे सरणी में मूल्य की आवश्यकता है [25] यह मौजूद होना चाहिए।
18 दिसंबर को splatto

जवाबों:


145

लंबाई का परीक्षण करें

int index = 25;
if(index < array.Length)
{
    //it exists
}

3
धन्यवाद। मैं विश्वास नहीं कर सकता मैं के बारे में सोचा नहीं था।
splatto

13
सुनिश्चित करें कि सूचकांक> = 0 भी।
एंड्रियास ग्रीच

2
और सुनिश्चित करें कि यह सरणी स्वयं अशक्त नहीं है :)
शिम्मी वेइटहैंडलर

1
क्योंकि C # में अर्रे इंडेक्स को अनुक्रमिक होना आवश्यक है। यह सच है। ऐसे संग्रह प्रकार हैं जिनमें अनुक्रमिक अनुक्रमणिका नहीं हैं, लेकिन वे C # में मूल सरणी प्रकार नहीं हैं।
reor

106

आप इसे प्राप्त करने के लिए LINQ का उपयोग कर सकते हैं:

var exists = array.ElementAtOrDefault(index) != null;

4
धन्यवाद, यह वही है जो मैं अनाड़ी सरणी लंबाई की जाँच के बजाय देख रहा था।
8

7
माइनर ध्यान दें, new object[]{ null }.ElementAtOrDefault(index)वापस आ जाएगी nullतत्व 0 पर के बाद से है nullElementAtOrDefaultसरणी सूचकांकों की जाँच के लिए उपयोग करना एक महान समाधान नहीं है , जो कि अंत में जोड़े गए समानता की जाँच परिणामों को अनिश्चित बना देता है।
क्रिस मैरिसिक

@ क्रिसमिसिक क्या आप एक उदाहरण दे सकते हैं?
एफएमएफएफ

2
@ChrisMarisic आप सही हैं, यदि आप केवल अस्तित्व के लिए जाँच करना चाहते हैं array.Length > index
शिम्मी वेइटहैंडलर

2
@ क्रिसमिसिक, वास्तव में यह एक प्रमुख नोट है, इस तरह के समाधान छिपे हुए कीड़े को जन्म देंगे
amd

21

"एक वैध तत्व है" से आपका क्या तात्पर्य है? आप बस कर सकते हैं:

if (array.Length >= 26)

जो आपको बताएगा कि 25 सरणी में एक वैध सूचकांक है या नहीं (0 लोअर बाउंड मानकर)।

यदि आपको यह जानना है कि यह गैर-अशक्त है या नहीं, तो बस उपयोग करें:

if (array[25] != null)

(या दो का एक संयोजन)।

यदि ये मदद नहीं करते हैं, तो कृपया अपनी समस्या के लिए "मान्य" का अधिक सटीक अर्थ दें।


3
दूसरे उदाहरण के लिए मुझे यह मिला। Index was outside the bounds of the array
मुहम्मद रहेल

4
@ माहेल: तो ठीक है, ऐसा लगता है कि आपको इसके बजाय पहले टेस्ट का उपयोग करना चाहिए था ...
जॉन स्कीट

12

मान लें कि आप यह भी जांचना चाहते हैं कि क्या आइटम शून्य नहीं है

if (array.Length > 25 && array[25] != null)
{
    //it exists
}

1
नोट: का उपयोग करने के लिए मिल गया &&है if (array.Length > 25 && array[25] != null), तो एकल &का उपयोग IndexOutOfRange अपवाद फेंक देंगे। MSDN
चेकसम

3
// I'd modify this slightly to be more resilient to a bad parameter
// it will handle your case and better handle other cases given to it:

int index = 25;

if (index >= 0 && index < array.Length)
{
    // Array element found
}

1

आप सरणी की लंबाई का उपयोग कर सकते हैं, और देख सकते हैं कि आपकी मनमानी संख्या उस सीमा में फिट होती है या नहीं। उदाहरण के लिए, यदि आपके पास आकार 10 है, तो सरणी [25] मान्य नहीं है, क्योंकि 25 10 से कम नहीं है।




0

आप जांच सकते हैं कि सूचकांक सरणी की लंबाई से कम है या नहीं। यह अशक्त या अन्य विषम मामलों की जांच नहीं करता है, जहां सूचकांक को एक मूल्य सौंपा जा सकता है, लेकिन स्पष्ट रूप से एक नहीं दिया गया है।


0

आप यह देखने के लिए सरणी की लंबाई देख सकते हैं कि क्या आइटम 25 सरणी में होने के अर्थ में मान्य है, तो आप उपयोग कर सकते हैं

if (array.Length > 25)
{ 
   if (array[25] != null)
   {
       //good
   }
}

यह देखने के लिए कि क्या सरणी आइटम स्वयं सेट किया गया है।


0

ऐसा लगता है कि आप विभिन्न क्षेत्रों को संग्रहीत करने के लिए एक सरणी का उपयोग कर रहे हैं। यह निश्चित रूप से एक कोड गंध है। मैं उच्च स्तर के कोड में आम तौर पर उपयुक्त (या आवश्यक) नहीं होने के कारण जितना संभव हो उतना सरणियों का उपयोग करने से बचता हूं।

एक सरल शब्दकोश में स्विच करना अल्पावधि में एक व्यावहारिक विकल्प हो सकता है। के रूप में एक बड़ा संपत्ति बैग वर्ग का उपयोग करेगा। बहुत सारे विकल्प हैं। आपके पास अभी जो समस्या है वह केवल खराब डिज़ाइन का एक लक्षण है, आपको केवल खराब डिज़ाइन को पैच करने के बजाय अंतर्निहित समस्या को ठीक करने पर ध्यान देना चाहिए, इसलिए यह थोड़े, थोड़े समय के लिए काम करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.