首页 > 解决方案 > 如何对涉及一些操作的键值对列表进行排序

问题描述

尽管堆栈溢出中有类似的问题,但我的解决方案无法解决这个问题。我有一个给定的号码,

例如:int target = 15

然后是键值对列表,

var farm = new List<KeyValuePair<string,int>>()
{
   new KeyValuePair<string,int>("apple", 25),
   new KeyValuePair<string,int>("veges", 35),
   new KeyValuePair<string,int>("watermelon", 0),
   new KeyValuePair<string,int>("grapes", 10),
}

现在我想根据给定数字 15 和对列表中的第二个元素的差异对列表进行排序。

到目前为止,这是我的解决方案,但没有进行任何更改:

farm.Sort((prod1, prod2) => Math.Abs(prod1.Value - target) < Math.Abs(prod2 - target) 
                                   ? prod1.Value : prod2.Value)

预期的排序应该是:

("grapes", 10)      // |10-15| = 5
("apple", 25)       // |25-15| = 10
("watermelon", 0)  // |0-15| = 15
("veges", 35)       // |35-15| = 20

任何见解将不胜感激。

标签: c#listalgorithmsortingkey-value

解决方案


您正在使用的重载List<T>.Sort接受委托Comparison<T>

docs中,对于 argumentsxy,返回值表示以下内容:

价值 意义
小于 0 x小于y
0 x等于y
大于 0 x大于y

目前,您只是返回Value较小参数的属性,该属性与上述标准无关。

您也没有考虑prod1prod2相等的情况。

最简单的解决方案是从另一个中减去一个:

farm.Sort(
    (prod1, prod2) => Math.Abs(prod1.Value - target) - Math.Abs(prod2 - target));

或者你可以使用int.CompareTowhich 做同样的事情:

farm.Sort(
    (prod1, prod2) => Math.Abs(prod1.Value - target)
        .CompareTo(Math.Abs(prod2 - target)));

推荐阅读