2013-07-25 19 views
-2

У меня есть список, который не сортируется вообще. Я использовал .Sort и не работает. Я хочу, чтобы числа сортировались в порядке убывания. 9,6,4,3,2Список Сортировка чисел в порядке убывания

List<string> tem = new List<string>(); 
using (SqlConnection cs = new SqlConnection(connStr)) 
{ 
     cs.Open(); 

     for (int x = 0; x < length; x++) 
     { 
      SqlCommand select = new SqlCommand("spTicketIssuance_GetTransactions", cs); 
       select.CommandType = System.Data.CommandType.StoredProcedure; 
       select.Parameters.AddWithValue("@TransDesc", TransType[x]); 

      SqlDataReader dr = select.ExecuteReader(); 

      while (dr.Read()) 
      { 
       tem.Add(dr["TransTime"].ToString()); //Adds all Transaction in the multiline textbox and adds them to List TransList 
      } 
      dr.Close(); 
     } 
      tem.Sort(); //NOT SORTING 
      cs.Close(); 
     } 
+1

, что является результатом, когда вы звоните 'sort'? –

+0

Сортировка не работает корректно, если вы не сделаете свой список или не переопределите свой вид, чтобы использовать его как int. – Botonomous

+3

Если они цифры, зачем конвертировать в строку? – melancia

ответ

2

Вы говорите, что вы сортировку чисел, но ваш список содержит строки. Сортировка числовых значений в строках приведет ко всем видам странных результатов, если числа имеют различное количество цифр.

Это как раз проблема с образцом, который вы дали в своем комментарии. Сортировка строки сравнивает первый символ (цифру) и видит, что 1 < 2, поэтому сортирует 12 до 2. Если вы начали с "2", "12", "7", вы увидите, что он дает тот же результат - "12", "2", "7".

Если вы сохраняете числовые значения, используйте числовой тип для своего списка.

Также Sort() всегда будет сортировать в порядке возрастания. Если вы хотите, чтобы он производил нисходящий результат, вам нужно было либо получить Reverse() результат, либо, как говорили другие ответы, используйте OrderByDescending(x => x) вместо Sort(). Последний вариант будет более эффективным.

Update

Я беру это из вашего комментария на @ ответ Стива, что тип данных в базе данных является символ типа, а?

Для вашего текстового поля вы можете сделать что-то вроде:

string[] lines = text.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries); 
List<int> trans = lines.Select(line => Int32.Parse(line)).ToList(); 

Второй строка взорвется, если записи не являются чисто численными, хотя.Более безопасным способом было бы что-то вроде этого:

IEnumerable<int?> values = lines.Select(line => 
{ 
    int value; 
    return Int32.TryParse(line, out value) ? (int?)value : null; 
}) 
List<int> trans = values.Where(v => v.HasValue).Select(v => v.Value).ToList(); 

Это сбросит все строки, которые не могут быть преобразованы к int.

После того, как вы получили свои данные в цифровом формате, сохраните его в базе данных таким образом, а остальная часть вашей обработки (сортировка и т. Д.) Станет намного проще.

Update 2

Как я уже сказал в своем комментарии, метод OrderByDescending() не изменяет список он применяется, но по существу представляет собой иной порядок перечисления по этому списку. Если вам нужны результаты в списке, просто добавьте ToList(), чтобы сделать это. Итак:

List<int> sortedTrans = transInt.OrderByDescending(x => x).ToList(); 
+0

Я получаю ошибку. У меня есть это так: text.Split ("\ r \ n" .ToCharArray(), StringSplitOptions.RemoveEmptyEntries) – Apollo

+0

ok Я получил его сейчас. Как мне сортировать по убыванию? делает это теперь по возрастанию. – Apollo

+0

@Apollo - вам нужно использовать '.OrderByDescending (x => x)'. Это не будет сортировать список на месте, но даст вам новый 'IEnumerable ' с элементами в том порядке, в котором вы хотите. –

2

Вы можете попробовать с

var ordered = tem.OrderByDescending(x => x); 

Однако, учитывая тот факт, что вы добавляете числа как строки, вы не можете получить правильный порядок, если ваши номера две цифры или более.

Например

List<string> tem = new List<string>() {"11", "5", "4"}; 
var ordered = tem.OrderByDescending(x => x); 
foreach(string s in ordered) 
    Console.WriteLine(s); 

даст вам "5", "4", "11", так как первый символ "5" больше, что первый символ "1" в "11" строки. Можно добавить строку с спецификатора формата, который добавляет символ для нуля, как этот

tem.Add(string.Format("{0:D3}", dr["TransTime"])); 

и ваш выход правильно отсортирован (если у вас нет номера 4-х цифр и более)

EDIT: Пример использования список (Of Integer) вместо List (Of String) и поместить результат в текстовом поле

List<int> tem = new List<int>(); 
using (SqlConnection cs = new SqlConnection(connStr)) 
{ 
    ..... 
    tem.Add(Convert.ToInt32(dr["TransTime"])); 
} 

var ordered = tem.OrderByDescending(x => x).ToList(); 
StringBuilder sb = new StringBuilder(); 
ordered.ForEach(x => sb.AppendLine(x.ToString())); 
textBox.Text = sb.ToString(); 
+2

Actaully, так как он ищет убывающий вам порядок OrderByDescending –

+0

@newStackExchangeInstance, вы, конечно, правы – Steve

+0

Я получаю этот Erro Нет перегрузки для метода 'ToString' принимает 1 аргумент – Apollo

1

использовать

list.Or derByDescending

поможет

+0

Стив опубликовал это с фрагментом. – Botonomous

0
var names = new List<string> { "abc", "xyz" }; 
var srotedDesc = names.OrderByDescending(x => x).ToList();