C / C # / C ++ में बैकवर्ड लूप करने का सबसे अच्छा तरीका क्या है?


101

मुझे एक सरणी के माध्यम से पीछे की ओर जाने की आवश्यकता है, इसलिए मेरे पास इस तरह का कोड है:

for (int i = myArray.Length - 1; i >= 0; i--)
{
    // Do something
    myArray[i] = 42;
}

क्या ऐसा करने का कोई बेहतर तरीका है?

अद्यतन: मैं उम्मीद कर रहा था कि शायद C # में इसके लिए कुछ अंतर्निहित तंत्र थे:

foreachbackwards (int i in myArray)
{
    // so easy
}

अद्यतन 2: वहाँ रहे हैं बेहतर तरीके। रूण पुरस्कार लेता है:

for (int i = myArray.Length; i-- > 0; )
{    
    //do something
}
//or
for (int i = myArray.Length; i --> 0; )
{
    // do something
}

जो नियमित C में और भी बेहतर लगता है (Twotymz के लिए धन्यवाद):

for (int i = lengthOfArray; i--; )
{    
    //do something
}

मुझे यकीन नहीं है कि मैं देखता हूं कि विकल्पों में से कोई भी बेहतर क्यों है, अगर अच्छाई में स्पष्टता या स्थिरता शामिल है।
dkretz

सच। मैं ऐसा करने के लिए एक अधिक उचित तरीका खोजने की उम्मीद कर रहा था, क्योंकि मुझे इसे अक्सर करना पड़ता है।
18 अगस्‍त को मूसीजेनसिस

3
इस सवाल का अधिकांश नीचे के उत्तरों की समीक्षा की तरह है। सुझाव है कि इसे काफी छोटा किया जाए।
ईनपोकलम

कृपया शीर्षक और हैशटैग से C और C ++ निकालें।
जस्कमर

जवाबों:


149

हालांकि, मैं थोड़ा अस्पष्ट हूं, लेकिन मैं कहूंगा कि ऐसा करने का सबसे टाइपोग्राफी तरीका है

for (int i = myArray.Length; i --> 0; )
{
    //do something
}

32
जब मैंने पहली बार आपका जवाब पढ़ा तो ऐसा लगा कि यह भी संकलन नहीं होगा, इसलिए मैंने मान लिया कि आप एक पागल व्यक्ति हैं। लेकिन यह वही है जो मैं देख रहा था: पाश के लिए पीछे की ओर लिखने का एक बेहतर तरीका।
3

3
मुझे लगता है कि मैं -> 0; उद्देश्य पर है। यही कारण है कि वह क्या द्वारा "typographically खुश" का अर्थ है
litb - Johannes Schaub

16
मैंने इसे "टाइपोग्राफिक रूप से भ्रमित" पाया। मेरे लिए, "-" तब तक सही नहीं लगता, जब तक कि वह उस चर के निकट न हो जो उसे प्रभावित कर रहा है।
मुसिएनेसिस

26
यह बहुत अस्पष्ट और अस्पष्ट है। मैं प्रोडक्शन कोड में ऐसा कुछ नहीं लिखूंगा ...
Mihai Todor


118

C ++ में आपको आधारिक रूप से पुनरावृत्तियों, या सूचकांकों का उपयोग करने के बीच विकल्प है। इस बात पर निर्भर करते हुए कि आपके पास एक सादा सरणी है, या ए std::vector, आप विभिन्न तकनीकों का उपयोग करते हैं।

एसटीडी :: वेक्टर का उपयोग करना

पुनरावृत्तियों का उपयोग करना

C ++ आपको इसका उपयोग करने की अनुमति देता है std::reverse_iterator:

for(std::vector<T>::reverse_iterator it = v.rbegin(); it != v.rend(); ++it) {
    /* std::cout << *it; ... */
}

सूचकांकों का उपयोग करना

अहस्ताक्षरित अभिन्न प्रकार से लौटे std::vector<T>::sizeहै नहीं हमेशा std::size_t। यह अधिक या कम हो सकता है। यह काम करने के लिए लूप के लिए महत्वपूर्ण है।

for(std::vector<int>::size_type i = someVector.size() - 1; 
    i != (std::vector<int>::size_type) -1; i--) {
    /* std::cout << someVector[i]; ... */
}

यह काम करता है, क्योंकि अहस्ताक्षरित अभिन्न प्रकार के मूल्यों को मोडुलो द्वारा उनकी बिट्स की गिनती के माध्यम से परिभाषित किया जाता है। इस प्रकार, यदि आप सेटिंग कर रहे हैं -N, तो आप समाप्त करते हैं(2 ^ BIT_SIZE) -N

Arrays का उपयोग करना

पुनरावृत्तियों का उपयोग करना

हम std::reverse_iteratoriterating करने के लिए उपयोग कर रहे हैं ।

for(std::reverse_iterator<element_type*> it(a + sizeof a / sizeof *a), itb(a); 
    it != itb; 
    ++it) {
    /* std::cout << *it; .... */
}

सूचकांकों का उपयोग करना

हम std::size_tऊपर बताए अनुसार सुरक्षित रूप से यहां का उपयोग कर सकते हैं , क्योंकि sizeofहमेशा std::size_tपरिभाषा से लौटता है।

for(std::size_t i = (sizeof a / sizeof *a) - 1; i != (std::size_t) -1; i--) {
   /* std::cout << a[i]; ... */
}

पॉइंटर्स पर लागू आकार के साथ नुकसान से बचना

वास्तव में एक सरणी का आकार निर्धारित करने का उपरोक्त तरीका बेकार है। यदि वास्तव में एक सरणी के बजाय एक सूचक है (जो अक्सर होता है, और शुरुआती इसे भ्रमित करेंगे), तो यह चुपचाप विफल हो जाएगा। एक बेहतर तरीका निम्नलिखित का उपयोग करना है, जो संकलक समय पर विफल हो जाएगा, अगर एक सूचक दिया गया है:

template<typename T, std::size_t N> char (& array_size(T(&)[N]) )[N];

यह पहले पारित सरणी का आकार प्राप्त करके काम करता है, और फिर उसी आकार के प्रकार के वर्ण के संदर्भ को वापस करने की घोषणा करता है। charके लिए परिभाषित किया गया है sizeof: 1. तो लौटे सरणी में से एक होगा sizeof: N * 1, जो कि हम देख रहे हैं, केवल संकलन समय मूल्यांकन और शून्य रनवे ओवरहेड के साथ।

करने के बजाय

(sizeof a / sizeof *a)

अपना कोड बदलें ताकि वह अब ऐसा करे

(sizeof array_size(a))

इसके अतिरिक्त, यदि आपके कंटेनर में रिवर्स इटरेटर नहीं है, तो आप बूस्ट के रिवर्स_िटरेटर
MP24

आपका array_size सांख्यिकीय रूप से आवंटित सरणियों के लिए काम करता है, लेकिन उदाहरण के लिए 'नया int [7]' होने पर मेरे लिए विफल रहा।
नैट पार्सन्स

2
हाँ जो इसका आशय है :) नया int [7] एक पॉइंटर लौटाता है। इसलिए आकार (नया int [7]) 7 * sizeof (int) नहीं देता, लेकिन sizeof (int *) लौटाएगा। array_size चुपचाप काम करने के बजाय उस मामले के लिए एक संकलन त्रुटि का कारण बनता है।
जोहान्स शाउब -

यह भी array_size (+ statically_allocated_array) आज़माएं, जो भी विफल हो जाता है, क्योंकि + ऑपरेटर सरणी को इसके पहले तत्व में पॉइंटर बनाता है। सादे आकार का उपयोग करने से आपको फिर से एक पॉइंटर का आकार मिलेगा
जोहान्स स्कैब - litb

पहली चीज के लिए - सिर्फ endऔर सिर्फ beginरिवर्स ऑर्डर में ही क्यों इस्तेमाल करें ?
टॉम ज़ातो -

54

C # में , Visual Studio 2005 या बाद के संस्करण का उपयोग करके, 'forr' टाइप करें और [TAB] [TAB] को हिट करें । यह एक forलूप का विस्तार करेगा जो संग्रह के माध्यम से पीछे की ओर जाता है।

यह गलत है (कम से कम मेरे लिए) आसान है, मैंने सोचा कि इस स्निपेट को डालना एक अच्छा विचार होगा।

उस ने कहा, मुझे पसंद है Array.Reverse()/ Enumerable.Reverse()और फिर आगे की ओर बेहतर है - वे अधिक स्पष्ट रूप से राज्य का इरादा रखते हैं।


41

मैं हमेशा ' टाइपोग्राफिक रूप से मनभावन ' कोड के खिलाफ स्पष्ट कोड पसंद करूंगा । इस प्रकार, मैं हमेशा उपयोग करूंगा:

for (int i = myArray.Length - 1; i >= 0; i--)  
{  
    // Do something ...  
}    

आप इसे पीछे की ओर लूप करने के मानक तरीके के रूप में मान सकते हैं।
केवल मेरे दो सेंट्स...


काम किया। सी # में अभी तक ऐसा नहीं किया है, लेकिन धन्यवाद।
पीसीपीजीएमआर

तो कैसे अगर सरणी वास्तव में बड़ी है (तो सूचकांक को अहस्ताक्षरित प्रकार का होना चाहिए)? size_t वास्तव में अहस्ताक्षरित है, यह नहीं है?
lalala

आप मुझे uint.See मार्क ग्रेवेल के पद के रूप में घोषित कर सकते हैं।
जैक ग्रिफिन

लपेटने के कारण एक अहस्ताक्षरित प्रकार के लिए काम नहीं करेंगे, एक टंकण के विपरीत। अच्छा नही।
Ocelot

17

में सी # का उपयोग कर Linq :

foreach(var item in myArray.Reverse())
{
    // do something
}

यह सुनिश्चित करने के लिए सबसे सरल है, लेकिन ध्यान दें कि सीएलआर के वर्तमान संस्करण में एक सूची को उलटने के लिए हमेशा ओ (1) ऑपरेशन के बजाय एक ओ (एन) ऑपरेशन होता है यदि यह एक आईलिस्ट <टी> हो सकता है; देख connect.microsoft.com/VisualStudio/feedback/...
ग्रेग बीच

1
जैसा दिखता है ।Rerseerse () सरणी की एक स्थानीय प्रतिलिपि बनाता है और फिर इसके माध्यम से पीछे की ओर पुन: प्रसारित करता है। यह एक सरणी की नकल करने के लिए अक्षम की तरह लगता है, ताकि आप इसके माध्यम से पुनरावृत्त कर सकें। मुझे लगता है कि "Linq" के साथ कोई भी पोस्ट अप-वोट के योग्य है। :)
मुसिनेसिस

एक संभावित ट्रेडऑफ़ है, लेकिन फिर आप इस मुद्दे पर दौड़ते हैं कि "उत्तर पर मतदान" (i -> 0) का परिणाम धीमा कोड हो सकता है क्योंकि (i) को हर बार सरणी के आकार के खिलाफ जांचना पड़ता है सूचकांक में के रूप में इस्तेमाल किया।
केलटेक्स

1
जबकि मैं मानता हूं कि लाइनक महान है, इस दृष्टिकोण के साथ समस्या यह है कि एक पुनरावृत्त आपको चुनिंदा रूप से सरणी के आइटम लेने की अनुमति नहीं देता है - उस स्थिति पर विचार करें जहां आप एक ऐरे के हिस्से के माध्यम से नेविगेट करना चाहते थे, लेकिन संपूर्ण नहीं बात ...
jesses.co.tt 21

11

यह निश्चित रूप से किसी भी सरणी के लिए सबसे अच्छा तरीका है जिसकी लंबाई एक हस्ताक्षरित अभिन्न प्रकार है। उन सरणियों के लिए जिनकी लंबाई एक अहस्ताक्षरित अभिन्न प्रकार है (जैसे std::vectorC ++ में), तो आपको अंतिम स्थिति को थोड़ा संशोधित करने की आवश्यकता है:

for(size_t i = myArray.size() - 1; i != (size_t)-1; i--)
    // blah

यदि आपने अभी कहा है i >= 0, तो यह अहस्ताक्षरित पूर्णांक के लिए हमेशा सही होता है, इसलिए लूप एक अनंत लूप होगा।


C ++ में "i--" स्वचालित रूप से उच्चतम मान के चारों ओर लपेटता है यदि मैं 0 था? क्षमा करें, मैं C ++ बिगड़ा हुआ हूं।
MusGGesis

गजब का। आप लोगों ने मुझे 12 साल पहले लिखी गई एक हार्ड-फिलिंग बग के कारण को समझने में मदद की। अच्छी बात है कि मैं C ++ में काम नहीं करता।
मुसैनीसिस

समाप्ति की स्थिति होनी चाहिए: i <myArray.size ()। केवल अहस्ताक्षरित int के अतिप्रवाह गुणों पर निर्भर करता है; पूर्णांकों और जातियों के विवरण का कार्यान्वयन नहीं। वैकल्पिक रूप से पूर्णांक निरूपण के साथ भाषाओं में पढ़ने और काम करने में आसानी होती है।
ईजगोटल

मुझे लगता है कि मेरे लिए एक बेहतर उपाय यह है कि मैं सी # दुनिया में रहूं जहां मैं किसी को चोट न पहुंचा सकूं।
मुशीगेंसिस

4

मुझे ठीक लगता है। यदि अनुक्रमणिका अहस्ताक्षरित (uint आदि) थी, तो आपको इसे ध्यान में रखना होगा। मुझे आलसी कहो, लेकिन उस (अहस्ताक्षरित) मामले में, मैं सिर्फ एक प्रति-चर का उपयोग कर सकता हूं:

uint pos = arr.Length;
for(uint i = 0; i < arr.Length ; i++)
{
    arr[--pos] = 42;
}

(वास्तव में, यहां तक ​​कि आपको गिरफ्तारी जैसे मामलों से सावधान रहने की आवश्यकता होगी। गति = uint.MaxValue ... शायद एक! = कहीं ... निश्चित रूप से, यह एक बहुत ही संभावना नहीं है!)


हालांकि "--पोस" बात मुश्किल है। मेरे पास अतीत में सहकर्मी थे जो कोड में बेतरतीब ढंग से "सही" चीजों के शौकीन थे जो उनके लिए बिल्कुल सही नहीं दिखते थे।
MusGenesis

1
तब .arr.Length -1 और pos-- का उपयोग
मार्क Gravell

4

CI में ऐसा करने के लिए:


int i = myArray.Length;
while (i--) {
  myArray[i] = 42;
}

मुसिनेसिस द्वारा जोड़ा गया C # उदाहरण:

{int i = myArray.Length; while (i-- > 0)
{
    myArray[i] = 42;
}}

यह मुझे पंसद है। मुझे यह महसूस करने में एक या दो दिन लगे कि आपका तरीका काम करता है। आशा है कि आपको अतिरिक्त सी # संस्करण से कोई आपत्ति नहीं है (अतिरिक्त ब्रेसिज़ हैं ताकि इंडेक्स लूप के लिए समान हो)।
मुसिएनेसिस

मुझे यकीन नहीं है कि मैं इसे उत्पादन कोड में उपयोग करूंगा, क्योंकि यह एक सार्वभौमिक "डब्ल्यूटीएफ यह है?" जो कोई भी इसे बनाए रखने की प्रतिक्रिया थी, लेकिन यह वास्तव में लूप के लिए एक सामान्य से टाइप करना आसान है, और कोई माइनस संकेत या> = प्रतीक नहीं।
मूसीजेनसिस

1
बहुत बुरा है C # संस्करण को अतिरिक्त "> 0" की आवश्यकता है।
मुसइनेसिस

मुझे यकीन नहीं है कि यह कौन सी भाषा है। लेकिन आपका पहला कोड स्निपेट निश्चित रूप से C :) नहीं है, केवल आपको स्पष्ट बताने के लिए। शायद आप C # लिखना चाहते थे और html इसे पार्स करने में असफल रहे या कुछ और?
जोहान्स शाउब -

@ लेटब: मुझे लगता है कि "myArray.Length" वैध सी (?) नहीं है, लेकिन लूप हिस्सा काम करता है और बहुत अच्छा लगता है।
3

3

सी ++ में ऐसा करने का सबसे अच्छा तरीका शायद इट्रिअटर (या बेहतर, रेंज) एडेप्टर का उपयोग करना है, जो कि आलसी होने पर अनुक्रम को बदल देगा।

मूल रूप से,

vector<value_type> range;
foreach(value_type v, range | reversed)
    cout << v;

रेंज "रेंज" प्रदर्शित करता है (यहां, यह खाली है, लेकिन मुझे पूरा यकीन है कि आप तत्वों को रिवर्स ऑर्डर में जोड़ सकते हैं)। बेशक, सीमा को पुनरावृत्त करना बहुत उपयोग नहीं है, लेकिन एल्गोरिदम और सामान के लिए उस नई सीमा को पारित करना बहुत अच्छा है।

इस तंत्र का उपयोग बहुत अधिक शक्तिशाली उपयोगों के लिए भी किया जा सकता है:

range | transformed(f) | filtered(p) | reversed

विल lazily रेंज "रेंज" की गणना करता है, जहां फ़ंक्शन "f" सभी तत्वों पर लागू होता है, जिनके लिए "p" सही नहीं है, और अंत में परिणामी सीमा उलट हो जाती है।

पाइप सिंटैक्स सबसे पठनीय IMO है, इसे इन्फिक्स दिया गया है। Boost.Range लाइब्रेरी अपडेट लंबित समीक्षा इसे लागू करता है, लेकिन यह स्वयं को भी करने के लिए बहुत सरल है। यह फंक्शन f और लाइन में P को उत्पन्न करने के लिए एक लैम्ब्डा DSEL के साथ और भी अच्छा है।


क्या आप हमें बता सकते हैं कि आपके पास "फॉर्च्यूनर" कहां से है? क्या BOOST_FOREACH के लिए यह #define है? सब तरफ प्यारा लगता है।
जोहान्स शाउब - ४


1

मैं थोड़ी देर का लूप पसंद करता हूं। यह मेरे iलिए एक लूप की स्थिति में गिरावट की तुलना में अधिक स्पष्ट है

int i = arrayLength;
while(i)
{
    i--;
    //do something with array[i]
}

0

मैं मूल प्रश्न में कोड का उपयोग करूँगा, लेकिन अगर आप वास्तव में foreach का उपयोग करना चाहते हैं और C # में पूर्णांक सूचकांक है:

foreach (int i in Enumerable.Range(0, myArray.Length).Reverse())
{
    myArray[i] = 42; 
}

-1

मैं यहाँ अपने सवाल का जवाब देने की कोशिश करने जा रहा हूँ, लेकिन मुझे वास्तव में यह पसंद नहीं है:

for (int i = 0; i < myArray.Length; i++)
{
    int iBackwards = myArray.Length - 1 - i; // ugh
    myArray[iBackwards] = 666;
}

इसके बजाय .Length - 1 - i - हर बार, शायद एक दूसरे चर पर विचार करें? मेरी [अद्यतन] पोस्ट देखें।
मार्क Gravell

मेरे ही सवाल पर डाउन-वोट किया। कठोर। यह मूल की तुलना में किसी भी प्रकार का क्लिंकर नहीं है।
मुशीगेंसिस 17

-4

नोट: यह पोस्ट अधिक विस्तृत और इसलिए विषय से दूर होने के कारण समाप्त हुई, मैं माफी चाहता हूं।

कहा जा रहा है कि मेरे साथी इसे पढ़ते हैं और मानते हैं कि यह मूल्यवान है 'कहीं'। यह धागा जगह नहीं है। मुझे आपकी प्रतिक्रिया की सराहना करनी चाहिए कि यह कहां जाना चाहिए (मैं साइट पर नया हूं)।


वैसे भी यह .NET 3.5 में C # संस्करण है जो आश्चर्यजनक है कि यह परिभाषित शब्दार्थ का उपयोग करके किसी भी संग्रह प्रकार पर काम करता है। यह एक सामान्य माप है (पुन: उपयोग!) नहीं किया जाता है या अधिकांश सामान्य देव परिदृश्य में सीपीयू चक्र न्यूनतम नहीं होता है, हालांकि यह कभी नहीं लगता है कि वास्तविक दुनिया (समयपूर्व अनुकूलन) में क्या होता है।

*** किसी भी संग्रह प्रकार पर काम करने वाली एक्सटेंशन विधि और प्रकार के एक ही मूल्य की अपेक्षा करते हुए एक कार्रवाई प्रतिनिधि ले रहे हैं, सभी रिवर्स में प्रत्येक आइटम पर निष्पादित होते हैं **

3.5

public static void PerformOverReversed<T>(this IEnumerable<T> sequenceToReverse, Action<T> doForEachReversed)
      {
          foreach (var contextItem in sequenceToReverse.Reverse())
              doForEachReversed(contextItem);
      }

पुराने .NET संस्करण या क्या आप Linq internals को बेहतर तरीके से समझना चाहते हैं? पर पढ़ें .. या नहीं ..

ASSUMPTION: .NET टाइप सिस्टम में Array टाइप IEnumerable इंटरफ़ेस (जेनेरिक IEnumerable केवल IEnumerable नहीं) से विरासत में मिला है।

यह आपको शुरुआत से अंत तक पुनरावृत्त करने की आवश्यकता है, हालांकि आप विपरीत दिशा में आगे बढ़ना चाहते हैं। जैसा कि IEnumerable किसी भी प्रकार के मान्य 'प्रकार' के एरे पर काम करता है,

CRITICAL MEASURE: हम मानते हैं कि यदि आप किसी भी अनुक्रम को उल्टे क्रम में संसाधित कर सकते हैं जो कि 'बेहतर' है, तो केवल पूर्णांकों में करने में सक्षम है।

.NET CLR 2.0-3.0 के लिए समाधान:

विवरण: हम किसी भी IEnumerable कार्यान्वयन उदाहरण को जनादेश के साथ स्वीकार करेंगे कि प्रत्येक उदाहरण में यह एक ही प्रकार का है। यदि हम एक सरणी को पुनः प्राप्त करते हैं, तो पूरे सरणी में X के उदाहरण होते हैं। यदि कोई अन्य उदाहरण एक प्रकार का है! = X एक अपवाद है:

एक एकल सेवा:

सार्वजनिक वर्ग ReverserService {निजी ReverserService () {}

    /// <summary>
    /// Most importantly uses yield command for efficiency
    /// </summary>
    /// <param name="enumerableInstance"></param>
    /// <returns></returns>
    public static IEnumerable ToReveresed(IEnumerable enumerableInstance)
    {
        if (enumerableInstance == null)
        {
            throw new ArgumentNullException("enumerableInstance");
        }

        // First we need to move forwarad and create a temp
        // copy of a type that allows us to move backwards
        // We can use ArrayList for this as the concrete
        // type

        IList reversedEnumerable = new ArrayList();
        IEnumerator tempEnumerator = enumerableInstance.GetEnumerator();

        while (tempEnumerator.MoveNext())
        {
            reversedEnumerable.Add(tempEnumerator.Current);
        }

        // Now we do the standard reverse over this using yield to return
        // the result
        // NOTE: This is an immutable result by design. That is 
        // a design goal for this simple question as well as most other set related 
        // requirements, which is why Linq results are immutable for example
        // In fact this is foundational code to understand Linq

        for (var i = reversedEnumerable.Count - 1; i >= 0; i--)
        {
            yield return reversedEnumerable[i];
        }
    }
}



public static class ExtensionMethods
{

      public static IEnumerable ToReveresed(this IEnumerable enumerableInstance)
      {
          return ReverserService.ToReveresed(enumerableInstance);
      }
 }

[TestFixचर] पब्लिक क्लास टेस्टिंग123 {

    /// <summary>
    /// .NET 1.1 CLR
    /// </summary>
    [Test]
    public void Tester_fornet_1_dot_1()
    {
        const int initialSize = 1000;

        // Create the baseline data
        int[] myArray = new int[initialSize];

        for (var i = 0; i < initialSize; i++)
        {
            myArray[i] = i + 1;
        }

        IEnumerable _revered = ReverserService.ToReveresed(myArray);

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));
    }

    [Test]
    public void tester_why_this_is_good()
    {

        ArrayList names = new ArrayList();
        names.Add("Jim");
        names.Add("Bob");
        names.Add("Eric");
        names.Add("Sam");

        IEnumerable _revered = ReverserService.ToReveresed(names);

        Assert.IsTrue(TestAndGetResult(_revered).Equals("Sam"));


    }

    [Test]
    public void tester_extension_method()
  {

        // Extension Methods No Linq (Linq does this for you as I will show)
        var enumerableOfInt = Enumerable.Range(1, 1000);

        // Use Extension Method - which simply wraps older clr code
        IEnumerable _revered = enumerableOfInt.ToReveresed();

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));


    }


    [Test]
    public void tester_linq_3_dot_5_clr()
    {

        // Extension Methods No Linq (Linq does this for you as I will show)
        IEnumerable enumerableOfInt = Enumerable.Range(1, 1000);

        // Reverse is Linq (which is are extension methods off IEnumerable<T>
        // Note you must case IEnumerable (non generic) using OfType or Cast
        IEnumerable _revered = enumerableOfInt.Cast<int>().Reverse();

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));


    }



    [Test]
    public void tester_final_and_recommended_colution()
    {

        var enumerableOfInt = Enumerable.Range(1, 1000);
        enumerableOfInt.PerformOverReversed(i => Debug.WriteLine(i));

    }



    private static object TestAndGetResult(IEnumerable enumerableIn)
    {
      //  IEnumerable x = ReverserService.ToReveresed(names);

        Assert.IsTrue(enumerableIn != null);
        IEnumerator _test = enumerableIn.GetEnumerator();

        // Move to first
        Assert.IsTrue(_test.MoveNext());
        return _test.Current;
    }
}

2
यार या डुडेट: मैं सिर्फ लिखने के लिए "(i i = myArray.Length - 1; i> = 0; i--)" के लिए एक कम-क्लूनी तरीका ढूंढ रहा था।
मूसीगैनेसिस

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