如何使用涉及的一些操作对键值对列表进行排序

How to sort a list of keyvaluepairs with some operations involved

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

例如: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

任何见解将不胜感激。

试试这个方法:

        int target = 15;
        var farm = new List<KeyValuePair<string, int>>()
        {
            new KeyValuePair<string, int>("apple", 25),
            new KeyValuePair<string, int>("veges", 30),
            new KeyValuePair<string, int>("watermelon", 35),
            new KeyValuePair<string, int>("grapes", 10),
        };
        farm.Sort((prod1, prod2) => Math.Abs(prod1.Value - target).CompareTo(Math.Abs(prod2.Value - target)));

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

来自 docs,对于参数 xy,return 值表示以下内容:

Value Meaning
Less than 0 x is less than y
0 x equals y
Greater than 0 x is greater than y

目前您只是 return 次要参数的 Value 属性,它与上述标准无关。

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

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

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

或者您可以使用 int.CompareTo,它的作用相同:

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