Как отсортировать список по полю - PullRequest
15 голосов
/ 24 октября 2011

Добрый день 4 u all

У меня есть список объектов

Мои объекты, такие как

Product = "iPhone"; 
Category = "SmartPhone";

Product = "HP"; 
Category = "PC";

Product = "HTC"; 
Category = "SmartPhone";

И я вставляю каждый объект в свой тест, чтобы он был похож на

List<Myobject> MyList = new List<Myobject>();

А теперь мне нужно отсортировать / упорядочить MyList по категории

Поскольку мне нужен мой список, чтобы сначала показать категорию смартфона, а затем другие

Ответы [ 3 ]

20 голосов
/ 24 октября 2011

Вы можете использовать List.Sort

l.Sort((p, q) => p.Category.CompareTo(q.Category));

Преимущество по сравнению с LINQ OrderBy заключается в том, что вы заказываете список на месте, а не генерируете IOrderedEnumerable<T>, который затем необходимо преобразовать в List<T>.

15 голосов
/ 24 октября 2011

Ознакомьтесь с методом расширения LINQ OrderBy.

MyList.OrderBy (p => p.Category);

Если вам нужен более сложный способ сортировки категорий, вы можете создать класс, который реализует интерфейс IComparer, и реализовать в нем свою логику сортировки..

        public class SmartphonesFirst : IComparer<Product>
        {
            const string Smartphone = "Smartphone";

            public int Compare( Product x, Product y )
            {
                if( x.Category == Smartphone && y.Category != Smartphone )
                {
                    return -1;
                }
                if( y.Category == Smartphone && x.Category != Smartphone )
                {
                    return 1;
                }
                else
                {
                    return Comparer<String>.Default.Compare (x.Category, y.Category);
                }
            }
        }

Вы можете сделать это без использования LINQ:

            var l = new List<Product> ();
            l.Add (new Product ()
            {
                Name = "Omnia 7",
                Category = "Smartphone"
            });

            l.Add (new Product ()
            {
                Name = "Mercedes",
                Category = "Car"
            });

            l.Add (new Product ()
            {
                Name = "HTC",
                Category = "Smartphone"
            });

            l.Add (new Product ()
            {
                Name = "AMD",
                Category = "CPU"
            });

            l.Sort (new SmartphonesFirst ());

            foreach( var p in l )
            {
                Console.WriteLine (String.Format ("{0} : {1}", p.Category, p.Name));
            }

или с использованием LINQ:

            var l = new List<Product> ();
            l.Add (new Product ()
            {
                Name = "Omnia 7",
                Category = "Smartphone"
            });

            l.Add (new Product ()
            {
                Name = "Mercedes",
                Category = "Car"
            });

            l.Add (new Product ()
            {
                Name = "HTC",
                Category = "Smartphone"
            });

            l.Add (new Product ()
            {
                Name = "AMD",
                Category = "CPU"
            });

            var sorted = l.OrderBy (p => p, new SmartphonesFirst ());

            foreach ( var p in sorted )
            {
                Console.WriteLine (String.Format ("{0} : {1}", p.Category, p.Name));
            }
6 голосов
/ 24 октября 2011

Вы можете использовать метод Sort и пользовательское сравнение для сортировки по категории (по убыванию), а затем по продукту (по возрастанию):

MyList.Sort((a, b) => {
  // compare b to a to get descending order
  int result = b.Category.CompareTo(a.Category);
  if (result == 0) {
    // if categories are the same, sort by product
    result = a.Product.CompareTo(b.Product);
  }
  return result;
});

Если вы хотите выделить смартфоны, а затемсортировка по возрастанию:

MyList.Sort((a, b) => {
  int result = (a.Category == "SmartPhone" ? 0 : 1) - (b.Category == "SmartPhone" ? 0 : 1);
  if (result == 0) {
    result = a.Category.CompareTo(b.Category);
    if (result == 0) {
      result = a.Product.CompareTo(b.Product);
    }
  }
  return result;
});
...