2015-09-10 7 views
2

Как отсортировать список по имени или по возрасту, не создавая другой файл cs? Этот метод, похоже, не работает вообще.Как мне сортировать список учеников?

case 6: 
{   //Sorting     
    do 
    {      
     Console.WriteLine("1. Sort by Name"); 
     Console.WriteLine("2. Sort by Age"); 
     int choice = int.Parse(Console.ReadLine()); 

     switch(choice) 
     {       
      case 1://Sort by Name 

       st.Sort((a,b) => a.getName().CompareTo(b.getName())); 
       ok = 1; 
       break; 

      case 2://Sort by Age 

       st.Sort((a,b) => a.getAge().CompareTo(b.getAge())); 
       ok = 1; 
       break;       
      default:Console.WriteLine("Not in the choices!"); ok = 0; 
       break;       
     }      
    } 
    while (ok != 1); 
} 
break;//case6-Sort 
+0

Что означает "Этот метод, кажется, не работает."? Возвращает ли он значения, и если да, то как они отличаются от ожидаемых? – HimBromBeere

+0

Определить «не работает». Что такое вход? Как вы тестируете выход? Что ты видишь? Что вы ожидали увидеть? –

+0

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

ответ

6

Использование LINQ должно быть проще:

var sorted = list.OrderBy(person => person.getName()) 
       .ToList(); 

Если вы хотите отсортировать по одному использования имущества только OrderBy, если вы хотите в дальнейшем отсортировать список в случае, если есть несколько пунктов, с тем же значение, используйте ThenBy:

var sorted = list.OrderBy(person => person.getName()) 
       .ThenBy(person => person.getAge()) 
       .ToList(); 
1

Вы можете использовать LINQ:

// sort by name 
var newList = st.OrderBy(a => a.getName()).ToList(); 

// sort by age 
var newList = st.OrderBy(a => a.getAge()).ToList(); 
2

Использование Linq

Сортировать по Имя

var students = st.OrderBy(s => s.Name).ToList(); 

заказа По возрасту

var students = st.OrderBy(s => s.Age).ToList(); 
0

Linq является самой последней практикой программирования, вы должны использовать его в вас случай:

case 6:{//Sorting 

       do{ 

        Console.WriteLine("1. Sort by Name"); 
        Console.WriteLine("2. Sort by Age"); 
        int choice = int.Parse(Console.ReadLine()); 

        switch(choice){ 

         case 1://Sort by Name 

          students = st.OrderBy(s=>s.name); 
          ok = 1; 
          break; 

         case 2://Sort by Age 

          students = st.OrderBy(s=>s.age); 
          ok = 1; 
          break; 

         default:Console.WriteLine("Not in the choices!"); ok = 0;break; 

        } 

       }while(ok != 1);}break;//case6-Sort 
+0

st.OrderBy не сортирует начальную коллекцию. он возвращает новый – Artiom

+0

@Artiom спасибо. обновленный ответ :) –

0

Почему d on't вы пытаетесь

SortedList

Надеется, что поможет.

1

Пожалуйста, НЕ используйте Linq, если вы специально хотите сделать список вещей на месте. Это неуместное решение (и кажется, что люди предлагают его только потому, что «он новее»).

В любом случае, на ваш вопрос. Ваш код должен работы. Вот компилируемое консольное приложение, которое демонстрирует, что оно работает.

Просмотрите этот код и сравните его с тем, что вы делаете. Я подозреваю, что ваша проблема лежит без области кода, которую вы нам показали.

using System; 
using System.Collections.Generic; 

namespace Demo 
{ 
    class Person 
    { 
     private readonly string name; 
     private readonly int age; 

     public Person(string name, int age) 
     { 
      this.name = name; 
      this.age = age; 
     } 

     public string getName() 
     { 
      return name; 
     } 

     public int getAge() 
     { 
      return age; 
     } 
    } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var persons = new List<Person> 
      { 
       new Person("C", 4), 
       new Person("D", 1), 
       new Person("A", 3), 
       new Person("B", 2) 
      }; 

      persons.Sort((a,b) => a.getName().CompareTo(b.getName())); 
      print(persons); // Ordered by name "A", "B", "C", "D". 

      persons.Sort((a, b) => a.getAge().CompareTo(b.getAge())); 
      print(persons); // Ordered by age "1", "2", "3", "4". 
     } 

     private static void print(List<Person> persons) 
     { 
      foreach (var person in persons) 
       Console.WriteLine("Name: {0}, Age: {1}", person.getName(), person.getAge()); 

      Console.WriteLine(); 
     } 
    } 
} 
0

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

//Sort by Name 
emp = emp.OrderBy(x => x.Name).ToList(); 

//Sort by Age 
emp = emp.OrderBy(x => x.Age).ToList(); 
Смежные вопросы