按升序对SortedList中的值进行排序

时间:2014-09-11 14:48:33

标签: c# .net c#-4.0

我在我的应用程序中使用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;         
}

我对这个相同的主题感到眩晕并且审视了一些话题,我不清楚这样做。任何人都可以帮我这样做。

由于

4 个答案:

答案 0 :(得分:1)

您可以使用SortedList的通用版本作为示例:

包含Linq命名空间:

using System.Linq;

试试这个:

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

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

您将不会获得新的SortedList,因为默认行为是按Key排序的。

正如@Tim评论所示,您可以尝试使用Cast<>方法的非通用版本将输出转换为IEnumerable<DictionaryEntry>并从那里开始订购。

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

答案 1 :(得分:1)

也许您应该重新考虑更改您正在使用的数据和数据结构。正如SortedListList <KeyValuePair<TKey,TVal>>所写的那样,它代表了一组键/值对,这些键/值对按键排序,可以通过键和索引访问。&#34; 这意味着您必须使用一些更适合您案例的其他数据结构(例如{{1}})并按值对其进行排序。

答案 2 :(得分: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>或其他一些实现{ {1}}):

IDictionary<string, string>

...或维护一个单独的集合:

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

如果您仅使用SortedList是因为您希望能够按值对其进行排序,请改用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; }

答案 3 :(得分:0)

这就是我按照所需顺序对列表进行排序的方法。

  1. 从查询
  2. 对表格进行排序
  3. 添加带前导零的lpad(例如key_value.PadLeft(4, '0');
  4. 将键值对添加到已排序列表
  5. 现在列表已按我的意图排序。