Sort list by field (C#)

后端 未结 8 1135
一向
一向 2021-01-01 09:09

I have class like:

class SortNode
{
    public Int32 m_valRating = 0;

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


        
相关标签:
8条回答
  • 2021-01-01 09:39

    In-place:

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

    Creating a new enumeration:

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

    Creating a new list:

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

    In-place is fastest and most memory efficient, but no good if you want to also retain the old list.

    The next is faster than the last and gives results as they go, but you have to re-do the sort to use it again, in which case the third is the one to go for.

    0 讨论(0)
  • 2021-01-01 09:43
    list.Sort((x,y) =>
        x.m_valRating.CompareTo(y.m_valRating));
    
    0 讨论(0)
  • 2021-01-01 09:43
    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);
    }
    
    0 讨论(0)
  • 2021-01-01 09:47

    It's easy using linq:

    var newlist = refSortNodeList.sort( n => n.m_valRating );
    
    0 讨论(0)
  • 2021-01-01 09:49

    Implement IComparable<T>

    0 讨论(0)
  • 2021-01-01 09:52

    Use Linq order by.

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

    Here is a real live example where I am pulling a list from a database but it is exactly the same concept.

     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>();
    
    0 讨论(0)
提交回复
热议问题