c# - 如何对涉及一些操作的键值对列表进行排序
问题描述
尽管堆栈溢出中有类似的问题,但我的解决方案无法解决这个问题。我有一个给定的号码,
例如: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
任何见解将不胜感激。
解决方案
您正在使用的重载List<T>.Sort
接受委托Comparison<T>
。
从docs中,对于 argumentsx
和y
,返回值表示以下内容:
价值 | 意义 |
---|---|
小于 0 | x 小于y |
0 | x 等于y |
大于 0 | x 大于y |
目前,您只是返回Value
较小参数的属性,该属性与上述标准无关。
您也没有考虑prod1
和prod2
相等的情况。
最简单的解决方案是从另一个中减去一个:
farm.Sort(
(prod1, prod2) => Math.Abs(prod1.Value - target) - Math.Abs(prod2 - target));
或者你可以使用int.CompareTo
which 做同样的事情:
farm.Sort(
(prod1, prod2) => Math.Abs(prod1.Value - target)
.CompareTo(Math.Abs(prod2 - target)));
推荐阅读
- swift - 使用 Alamofire 5 上传文件到 RocketChat 服务器
- python - 与bash md5sum相比,Python hashlib md5输出不同且速度慢?
- c# - 清理帖子条目!ASP.NET API
- javascript - 如何从 HTML 获取信息到 Javascript 但已连接到 API
- azure-cosmosdb - 如何通过 SDK 或 Select QUERY 在 CosmosBD 中使用分区键
- c# - 有没有办法可以在 Migradoc 中动态创建表
- jboss - jboss Standalone-full.xml ,min-pool-size 和 max-pool-size 问题
- amazon-web-services - 如何通过特定用户的 Bearer 令牌访问与 S3 Bucket 连接的 AWS CloudFront(JWT 自定义身份验证)
- linux-kernel - 即使编译成功也无法安装内核
- python - PyInstaller 生成的 PyQT5 应用程序的可执行文件显示“QCoreApplication::exec: 事件循环已在运行”