如何使用涉及的一些操作对键值对列表进行排序
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,对于参数 x
和 y
,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
属性,它与上述标准无关。
您也没有考虑 prod1
和 prod2
相等的情况。
最简单的解决方案是从另一个中减去一个:
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)));
尽管堆栈溢出中有很多类似的问题,但我的解决方案无法解决这个问题。我有给定的号码,
例如: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,对于参数 x
和 y
,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
属性,它与上述标准无关。
您也没有考虑 prod1
和 prod2
相等的情况。
最简单的解决方案是从另一个中减去一个:
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)));