我在我的应用程序中使用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;
}
我对这个相同的主题感到眩晕并且审视了一些话题,我不清楚这样做。任何人都可以帮我这样做。
由于
答案 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)
也许您应该重新考虑更改您正在使用的数据和数据结构。正如SortedList
中List <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)
这就是我按照所需顺序对列表进行排序的方法。
key_value.PadLeft(4, '0');
)