2011-03-28 17 views
18

मैं की तरह वर्ग है:क्रमबद्ध सूची

class SortNode 
{ 
    public Int32 m_valRating = 0; 

    public SortNode(Int32 valRating) 
    { 
     this.m_valRating = valRating; 
    } 
} 

और कुछ सूची refSortNodeList:

 List<SortNode> refSortNodeList = new List<SortNode>(); 

     Random refRandom = new Random(); 

     for (int i = 0; i < 100; ++i) 
     { 
      refSortNodeList.Add(new SortNode(refRandom.Next(-10, 30))); 
     } 

     foreach (var varSortNode in refSortNodeList) 
     { 
      Console.WriteLine("SortNode rating is {0}", varSortNode.m_valRating); 
     } 

कैसे आसानी से अपने refSortNodeListm_valRating द्वारा क्षेत्र सॉर्ट करने के लिए? या शायद मुझे किसी अन्य सूची वर्ग का उपयोग करने की आवश्यकता है?

धन्यवाद !!!

+2

सार्वजनिक क्षेत्रों एक बुरा विचार है, btw –

उत्तर

49
list.Sort((x,y) => 
    x.m_valRating.CompareTo(y.m_valRating)); 
+0

+1 यह एक है :) –

+2

हालांकि यह एक शून्य की तुलना में फेंकता है। –

+2

@Jon - कि चारों ओर पाठ्यक्रम कोड की youcan, लेकिन एक अशक्त यहाँ शायद एक त्रुटि होगा वैसे भी –

1

यह आसान LINQ उपयोग कर रहा है:

var newlist = refSortNodeList.sort(n => n.m_valRating); 
+0

गलत विधि, गलत पूंजीकरण हैं। –

+0

आप सही हैं। मैं ऑर्डरबी के साथ मिश्रित हूं() – dcarneiro

+0

'क्रमबद्ध करें()' मूल्य वापस नहीं करता है और 'ऑर्डरबी() 'सूची वापस नहीं करता है। – mgronber

7

उपयोग Linq से आदेश।

var mySortedList = refSortNodeList.OrderBy(x => x.m_valRating); 

यहां एक वास्तविक लाइव उदाहरण है जहां मैं डेटाबेस से एक सूची खींच रहा हूं लेकिन यह बिल्कुल वही अवधारणा है। अपने छँटाई में बनाया का उपयोग करने के IComparable को लागू करने की आवश्यकता होगी

refSortNodeList.OrderBy(n => n.m_valRating); 

आप और अधिक जटिल छँटाई की जरूरत है:

vendorProducts = (from vp in db.COMPANIES_VND_PRODUCTS 
        join p in db.CT_CT_INV_CLASSES on vp.CLASS_ID equals p.CLASS_ID 
        join m in db.CT_CT_MODALITY_CODES on vp.MODALITY_ID equals m.MODALITY_ID 
        where vp.COMPANY_ID == companyId 
        select new ProductTypeModality 
        { 
         Active = p.ACTIVE.Equals("Y") ? true : false, 
         BioMedImaging = p.BIOMED_IMAGING, 
         Code = p.CLASS_CODE, 
         Description = p.DESCRIPTION, 
         Id = p.CLASS_ID, 
         PricingMargin = p.PRICING_MARGIN, 
         ModalityCode = m.MODALITY_CODE, 
         ModalityId = m.MODALITY_ID, 
         VendorId = companyId 
        }).OrderBy(x => x.Code).ToList<ProductTypeModality>(); 
1

आप बुनियादी प्रकार के लिए Linq का उपयोग कर सकते हैं।

10

यथा-स्थान: एक नई सूची बनाने

var newEnum = refSortNodeList.OrderBy(x => x.m_valRating); 

:

refSortNodeList.Sort(
    (x, y) => 
    x == null ? (y == null ? 0 : -1) 
     : (y == null ? 1 : x.m_valRating.CompareTo(y.m_valRating)) 
); 

एक नया गणन बनाना

var newList = refSortNodeList.OrderBy(x => x.m_valRating).ToList(); 

यथा-स्थान सबसे तेज़ और सबसे स्मृति कुशल है, लेकिन यदि आप पुरानी सूची को बरकरार रखना चाहते हैं तो अच्छा नहीं है।

अगले पिछले की तुलना में तेजी है और परिणाम देता है के रूप में वे जाते हैं, लेकिन आप प्रकार जो मामले में तीसरे के लिए जाने के लिए एक है, उसका दोबारा उपयोग करने से पुन: करने के लिए।

+0

+1 क्योंकि यह 'शून्य' को संभालता है –

1

इस प्रयास करें:

refSortNodeList.Sort(new delgate(SortNode x, SortNode y) 
    { 
     return x.CompareTo(y); 
    } 
); 
0
List<SortNode> refSortNodeList = new List<SortNode>(); 

Random refRandom = new Random(); 

for (int i = 0; i < 100; ++i) { 
    refSortNodeList.Add (new SortNode (refRandom.Next (-10, 30))); 
} 

// Use this (Linq) if you're using .NET 3.5 or above. 
var sortedList = refSortNodeList.OrderBy (node => node.m_valRating); 
foreach (var varSortNode in sortedList) { 
    Console.WriteLine ("SortNode rating is {0}", varSortNode.m_valRating); 
} 

// Use this otherwise (e.g. .NET 2.0) 
refSortNodeList.Sort (
    delegate (SortNode n1, SortNode n2) { 
     return n1.m_valRating.CompareTo (n2.m_valRating); 
    } 
); 

foreach (var varSortNode in refSortNodeList) { 
    Console.WriteLine ("SortNode rating is {0}", varSortNode.m_valRating); 
} 
संबंधित मुद्दे