排序字典>基于价值

本文关键字:于价值 int 字典 string 排序 列表 | 更新日期: 2023-09-27 18:17:30

我有一个字符串作为键的字典和一个整数列表作为值的有序列表;有可能在c#中根据值的顺序来排序吗?

例如

:myDict:

{
    "hp",<10,14,23>
     "dell", <6,8,9,10>
     "asus", <6,9,18>
     "mac", <7,98>
}

排序为:

{
       "dell", <6,8,9,10>
        "asus", <6,9,18>
        "mac", <7,98>
        "hp",<10,14,23>
 }

这是我尝试过的:

//this creates a dictionary with requirements stated above for testing
Dictionary<string, List<int>> myDict = new Dictionary<string, List<int>
            >();

        var numbers = "8,13,16,21,24,25,31,33,36,63,66,70,76,82,94".Split(',').Select(Int32.Parse).ToList();
        myDict .Add("asus", numbers);
        numbers = "6,84,90,99".Split(',').Select(Int32.Parse).ToList();
        myDict .Add("dell", numbers);
        numbers = "10,11,20,21,23,26,28,29,31,38,39,40,50,52,61,65,66,70,75,94".Split(',').Select(Int32.Parse).ToList();
        myDict.Add("hp", numbers);
        numbers = "4,17,42,56,62,79,80".Split(',').Select(Int32.Parse).ToList();
        myDict .Add("mac",numbers );            

应该进行排序的部分:

var orderedDictionary = myDict.OrderByDescending(pairs => pairs.Value);

上面给出了"至少有一个对象必须实现IComparable"的错误。我还尝试将列表转换为字符串并执行以下操作:

var sortedDict = from entry in myDict
                             orderby entry.Value
                                 ascending
                             select entry;

上面的操作有效,但是它将数字视为字符串;因此10,85会出现在8,6之前,我猜这是因为","ASCII表示高于数字。

如何在c#中对一个带有整数排序列表的字典进行排序?还是通过检查每个单元格来进行手动排序的唯一方法?

排序字典<string,列表<int>>基于价值

您应该为您的List<int>实现IComparer<T>:

public MyListComparer : IComparer<List<int>>
{
    public int Compare(List<int> x, List<int> y)
    {
        var minLength = x.Count < y.Count ? x.Count : y.Count;
        for (var i = 0 ;i < minLength; i++)
        {
            if (x[i] > y[i])
            {
                return 1;
            }
            if (x[i] < y[i])
            {
                return -1;
            }
        }
        if (x.Count > y.Count)
        {
            return 1;
        }
        if (y.Count > x.Count)
        {
            return -1;
        }
        return 0;
    }
}

和LINQ order的重载一起使用:

var orderedDictionary = myDict.OrderBy(pairs => pairs.Value, new MyListComparer());