c # किसी सूची को उलटने की कोशिश करना


90
public class CategoryNavItem
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Icon { get; set; }

    public CategoryNavItem(int CatID, string CatName, string CatIcon)
    {
        ID = CatID;
        Name = CatName;
        Icon = CatIcon;
    }
}

public static List<Lite.CategoryNavItem> getMenuNav(int CatID)
{
    List<Lite.CategoryNavItem> NavItems = new List<Lite.CategoryNavItem>();

    -- Snipped code --

    return NavItems.Reverse();
}

रिवर्स काम नहीं करता है:

Error 3 Cannot implicitly convert type 'void' to 'System.Collections.Generic.List<Lite.CategoryNavItem>'

किसी भी विचार क्यों यह हो सकता है?

जवाबों:


143

प्रयत्न:

NavItems.Reverse();
return NavItems;

List<T>.Reverse()एक है यथा-स्थान रिवर्स; यह एक नई सूची नहीं लौटाता है।

यह करता है LINQ है, जहां के विपरीत Reverse() रिटर्न उलट अनुक्रम है, लेकिन यह है जब वहाँ एक उपयुक्त गैर विस्तार तरीका है हमेशा एक विस्तार विधि वरीयता में नहीं चुना गया। इसके अलावा, LINQ मामले में यह होना चाहिए:

return someSequence.Reverse().ToList();

1
उन लोगों के लिए FYI करना जो एक सरणी को उल्टा करना चाहते हैं, यह काम नहीं करता है, आपको इसके बजाय Array.Reverse (सरणी) को कॉल करने की आवश्यकता है।
इयान वार्ड

10
बस एक दिलचस्प विशेष मामले से पीड़ित: जब एक चर के रूप में घोषित किया जाता है List<int> list, तो list.Reverse()इन-प्लेस संस्करण को कॉल करता है। फिर, एक साथी डेवलपर अतिरिक्त स्मार्ट है और घोषणा को बदल देता है IList<int>। यह कोड को बहुत ही अप्रत्याशित तरीके से तोड़ता है, क्योंकि तब फ़ंक्शन IEnumerable<TSource> Reverse<TSource>(this IEnumerable<TSource> source)अधिभार का उपयोग किया जाता है, और यह किसी का ध्यान नहीं जाता है - आपको अप्रयुक्त वापसी मूल्य के लिए देखना होगा, और वह शायद ही कभी C # में दिखाई देता है
Cee McSharpface

102

एक वर्कअराउंड होगा Return NavItems.AsEnumerable().Reverse();


1
यह अच्छा है और मेरे मामले में काम करता है (मूल सूची को अछूता छोड़ दें)! धन्यवाद
ghiboz


8

Reverse()उलटी सूची को वापस नहीं करता है, यह मूल सूची को संशोधित करता है। तो निम्नलिखित के रूप में इसे फिर से लिखना:

return NavItems.Reverse(); 

सेवा

NavItems.Reverse(); 
return NavItems;

6

Reverse() आपके फ़ंक्शन की अपेक्षा के अनुसार सूची वापस नहीं करता है।

NavItems.Reverse();
return NavItems;

और क्योंकि यह शून्य देता है, आप इसे संशोधित करने के लिए निर्दिष्ट नहीं कर सकते।
फ्लैगबग

3

.Reverse "इन-प्लेस" को उलट देता है ..., कोशिश करें

NavItems.Reverse();
return NavItems;

2

यदि आपके पास अपने उदाहरण में एक सूची है:

List<Lite.CategoryNavItem> NavItems

आप मूल सूची को संशोधित किए बिना एक नई सूची वापस करने के लिए सामान्य रिवर्स <> एक्सटेंशन विधि का उपयोग कर सकते हैं। बस इस तरह विस्तार विधि का उपयोग करें:

List<Lite.CategoryNavItem> reversed = NavItems.Reverse<Lite.CategoryNavItem>();

नोट: आपको एक्सटेंशन विधि का उपयोग करने के लिए <> सामान्य टैग निर्दिष्ट करने की आवश्यकता है। मत भूलना

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