Сортировать список по полю (C #) - PullRequest
27 голосов
/ 28 марта 2011

У меня есть класс, как:

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

Как легко отсортировать мое поле refSortNodeList по m_valRating? Или, может быть, мне нужно использовать какой-нибудь другой List класс?

Ответы [ 8 ]

61 голосов
/ 28 марта 2011
list.Sort((x,y) =>
    x.m_valRating.CompareTo(y.m_valRating));
13 голосов
/ 28 марта 2011

На месте:

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

Создание нового перечисления:

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

Создание нового списка:

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

На месте быстрее инаиболее эффективный в использовании памяти, но бесполезно, если вы также хотите сохранить старый список.

Следующий быстрее, чем предыдущий, и дает результаты по мере их поступления, но вы должны заново выполнить сортировку, чтобы использовать его сновав этом случае третий - тот, на которого нужно пойти.

8 голосов
/ 28 марта 2011

Используйте Linq для заказа.

var mySortedList = refSortNodeList.OrderBy(x => x.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>();
2 голосов
/ 28 марта 2011

Реализация IComparable<T>

1 голос
/ 28 марта 2011

Попробуйте это:

refSortNodeList.Sort(new delgate(SortNode x, SortNode y)
   {
       return x.CompareTo(y);
    }
);
1 голос
/ 28 марта 2011

Вы можете использовать Linq для основных видов:

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

Если вам нужна более сложная сортировка, вам потребуется реализовать IComparable для использования встроенной сортировки.

0 голосов
/ 28 марта 2011
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 голосов
/ 28 марта 2011

Это просто, используя linq:

var newlist = refSortNodeList.sort( n => n.m_valRating );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...