2014-09-11 3 views
1

Я использую SortedList в своем приложении. По умолчанию список упорядочивается по ключу в порядке возрастания. Мне нужно заказать SortedList по значениям в порядке возрастания, а не по ключу.Сортировка значения в SortedList по возрастанию

SortedList sortinlist = new SortedList(); 

public bool Add(string val1, string val2) 
{ 
     Reading reading = new Reading(val1, val2); 
     sortinlist .Add(val1, val2); 
     return true;   
} 

Я вытаращил с этой же темой и судил нитки, я не ясно, в выполнении this.Can любой один помочь мне в этом.

Благодаря

+1

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

+0

@phoog Можете ли вы объяснить мне, как получить это, заказанное в другой коллекции. Мне нужны оба значения и ключи. – Royal

ответ

1

Вы можете использовать общую версию SortedList, для образца:

включают пространство имен Linq:

using System.Linq; 

и попробовать это:

SortedList<string, string> sortinlist = new SortedList<string, string>(); 

var result = sortinlist.OrderBy(x => x.Value).ToList(); 

You не получит новый SortedList, потому что поведение по умолчанию упорядочено по Key.

Как пояснение @Tim ниже, вы можете попробовать с нестандартной версией с методом Cast<> для преобразования вывода в IEnumerable<DictionaryEntry> и заказать оттуда.

var result = sortinlist.Cast<DictionaryEntry>().OrderBy(x => x.Value); 
+1

+1 для _ «Вы не получите новый SortedList, потому что поведение по умолчанию упорядочивается с помощью Key« _ Btw, вы можете использовать 'sortinlist.Cast (). OrderBy (kv => kv.Value)' на заказ не-общий «SortedList». –

+0

Должен ли я добавить var result = sortinlist.OrderBy (x => x.Value) .ToList(); после sortinlist .Add (val1, val2); в методе Add() – Royal

+0

Я попробовал, как я упомянул в комментарии, я получаю это сообщение: «Неоригинальный тип« System.Collections.SortedList »не может использоваться с аргументом типа» в инициализации SortedList. – Royal

1

Возможно, вам стоит пересмотреть изменение структуры данных и данных, которые вы используете. Как написано в documentation page для SortedList, оно «представляет собой набор пар ключ/значение, которые сортируются по ключам и доступны по ключу и индексу». Это означает, что вам нужно использовать другую структуру данных, которая более подходит для вашего случая (например, List <KeyValuePair<TKey,TVal>>) и сортировать ее по значению.

1

Если значения гарантированно уникальны, вы можете использовать два SortedLists или SortedDictionaries (кстати, SortedDictionary намного эффективнее, если вы вставляете данные не в порядок, поэтому я буду использовать их для второй коллекции) :

SortedList sortinlist = new SortedList(); 
SortedDictionary valueOrder = new SortedDictionary<string, string>(); 

public bool Add(string val1, string val2) 
{ 
     Reading reading = new Reading(val1, val2); 
     sortinlist.Add(val1, val2); 
     valueOrder.Add(val2, val1); 
     return true; 
} 

Если значения не гарантированно быть уникальным, то вы можете рассчитать новую коллекцию всякий раз, когда вам нужны данные для значения (здесь, я полагаю, что sortinlist является SortedList<string, string> или какой-либо другой тип, который реализует IDictionary<string, string>):

var valueOrder = sortinlist.OrderBy(kvp => kvp.Value).ToList(); 

... или поддерживать отдельную коллекцию:

SortedList<string, string> sortinlist = new SortedList<string, string>(); 
List<KeyValuePair<string, string>> valueOrder = new List<KeyValuePair<string, string>>(); 

public bool Add(string val1, string val2) 
{ 
     Reading reading = new Reading(val1, val2); 
     sortinlist.Add(val1, val2); 
     int targetIndex = /* to do: calculate proper index */ 
     valueOrder.Insert(targetIndex, new KeyValuePair<string, string>(val2, val1)); 
     return true; 
} 

Если вы используете SortedList только потому, что вы надеялись, чтобы иметь возможность сортировать ее по значениям, используйте Dictionary<string, string> вместо этого.

+0

@TimSchmelter Я боюсь, что вы правы! Я не могу сейчас проработать, но, к OP, если вам нужно больше разъяснений, пожалуйста, отправьте комментарий с просьбой об этом, и я буду расширять этот пост, когда смогу. – phoog

0

Это то, что я сделал для сортировки списка в необходимом порядке.

  1. сортировки таблицы из запроса
  2. Добавить LPAD с ведущими нулями (например key_value.PadLeft(4, '0');)
  3. Добавить пару ключей значение в отсортированном списке
  4. Теперь список уже отсортирован, как я предполагал.
Смежные вопросы