2011-03-28 28 views
18

tengo clase como:Ordenar la lista por el campo (C#)

class SortNode 
{ 
    public Int32 m_valRating = 0; 

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

y alguna lista 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); 
     } 

cómo ordenar fácilmente mi refSortNodeList por m_valRating campo? ¿O tal vez necesito usar alguna otra clase de lista?

Gracias!

+2

campos públicos son una mala idea, por cierto –

Respuesta

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

+1 Esa es la :) :) –

+2

Lanza si se compara un valor nulo. –

+2

@Jon - por supuesto, puede codificarlo, pero un nulo aquí probablemente sea un error de todos modos –

1

es fácil usando LINQ:

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

método incorrecto, la capitalización mal. –

+0

Tienes razón. Me mezclé con OrderBy() – dcarneiro

+0

'Sort()' no devuelve el valor y 'OrderBy()' no devuelve la lista. – mgronber

7

para utilizar LINQ por.

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

Aquí hay un ejemplo real donde estoy sacando una lista de una base de datos, pero es exactamente el mismo concepto.

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

Puede utilizar LINQ para las clases básicas:

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

Si necesita más compleja clasificación de su necesitarán para implementar IComparable utilizar el construido en la clasificación.

10

En lugar:

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

Creación de una nueva enumeración:

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

Creación de una nueva lista:

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

En lugar es más rápido y más eficiente de la memoria, pero no es bueno si también quieres conservar la lista anterior.

La siguiente es más rápida que la anterior y da resultados a medida que avanzan, pero debe volver a hacer la ordenación para utilizarla de nuevo, en cuyo caso la tercera es la que hay que buscar.

+0

+1 porque maneja 'null's –

1

Prueba esto:

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); 
} 
Cuestiones relacionadas