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

C# 按升序对SortedList中的值进行排序,c#,.net,c#-4.0,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 t

我在应用程序中使用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;         
}
我目不转睛地盯着同一个话题,裁判了一些线索,我不清楚该怎么做。有人能帮我吗


谢谢

对于示例,您可以使用的通用版本:

包括Linq命名空间:

using System.Linq;
试试这个:

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

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

也许您应该重新考虑更改正在使用的数据和数据结构。如中所述,它“表示按键排序并可按键和索引访问的键/值对集合。”
这意味着您必须使用更适合您的情况的其他数据结构(例如
列表
),并按值对其进行排序。

如果保证值是唯一的,您可以使用两个SortedList或SortedDictionary(顺便说一句,如果按顺序插入数据,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;
}
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 sortinlist=新的SortedList();
列表值顺序=新列表();
公共bool Add(字符串val1、字符串val2)
{
读数=新读数(val1,val2);
sortinlist.Add(val1,val2);
int targetIndex=/*要执行的操作:计算适当的索引*/
valueOrder.Insert(targetIndex,新的KeyValuePair(val2,val1));
返回true;
}

如果您使用SortedList仅仅是因为希望能够按值对其进行排序,请改用
字典

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

  • 从查询中对表进行排序
  • 添加带前导零的lpad(例如,
    key_value.PadLeft(4,'0');
  • 将键值对添加到排序列表中
  • 现在列表已经按照我的预期进行了排序

  • 如果您在排序列表中需要按该顺序排列,那么您就倒霉了。如果您在其他集合中需要按该顺序排列,答案取决于可以是哪种集合,以及您是同时需要值和键还是只需要值。@phoog能否解释如何在其他集合中按该顺序排列。我需要这两个值s和键。+1对于“由于默认行为是按键排序的,因此不会获得新的SortedList”顺便说一句,您可以使用
    sortinlist.Cast().OrderBy(kv=>kv.Value)
    对非通用的
    SortedList
    进行排序。我是否应该在sortinlist.add(val1,val2)之后添加var result=sortinlist.OrderBy(x=>x.Value).ToList();在sortinlist.add(val1,val2)之后添加()方法正如我在评论中提到的,我尝试过,我得到了这样一个错误:“非泛型类型'System.Collections.SortedList'不能与类型参数一起使用”,在SortedList初始化时。@Royal您需要
    使用System.Collections.Generic
    而不是
    使用System.Collections
    @TimSchmelter我担心您可能是对的!我现在无法详细说明,但是,如果您需要更多说明,请发表评论,询问相关信息,我会在可能的情况下扩展帖子。
    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;
    }