按其他字典的结果排序字典

Posted

技术标签:

【中文标题】按其他字典的结果排序字典【英文标题】:Order Dictionary by the result of other dictionary 【发布时间】:2022-01-16 13:28:47 【问题描述】:

正在寻找可以帮助我使用 C#、LINQ 的人。

我有一个Dictionary<int,int>,我要这样订购:.OrderBy(_ => _.Value).ThenBy(_ => ThisMethodReturnsAnotherIReadOnlyDict<int,int>()).ThenByDescending(_ => _.Key)

我想要的是按第一个字典的值排序,然后如果仍然有相等的值,我希望ThisMethodReturnsAnotherIReadOnlyDict<int,int>() 打破这条平局。这个ThisMethodReturnsAnotherIReadOnlyDict 的第一个键/值打破平局并处于领先地位。最后,如果一切都失败了,那么按它的键降序排序。

类似的一些数据:

(第一本词典)

[1,400]
[2,550]
[3,200]
[4,200]

(第二本词典)

[3,50]
[4,140]
[2,600]
[1,700]

对于这种情况,我希望我的订单返回:[3,50]

有人可以帮忙吗? 谢谢!

【问题讨论】:

Dictionary&lt;&gt; 的上下文中,“第一个键/值”是什么意思?他们没有秩序…… 这注定要失败。 "出于枚举的目的,字典中的每个项目都被视为一个 KeyValuePair&lt;TKey,TValue&gt; 结构,表示一个值及其键。返回项目的顺序是未定义的。" 来源:MSDN Dictionary<TKey,TValue> Class 【参考方案1】:

看起来你正在寻找这样的东西:

var firstDict = new Dictionary<int, int>() 
    1,400, 
    2,550,
    3,200,
    4,200
;

var secondDict = new Dictionary<int, int>() 
    3,50, 
    4,140,
    2,600,
    1,700
;

var result = (from kvp in firstDict
             join tieBreaker in secondDict on kvp.Key equals tieBreaker.Key
             select new  kvp.Key, V1 = kvp.Value, V2 = tieBreaker.Value )
                .OrderBy(x => x.V1)
                .ThenBy(x => x.V2)
                .ThenByDescending(x => x.Key)
                .First();

这将通过其键将第一个和第二个字典连接在一起,并将分别按第一个字典的值、第二个字典的值然后按键本身降序排列。

【讨论】:

谢谢卡洛斯!我认为这很好用。但是让我们假设第二个字典是空的。那我的加入就不行了。知道如何解决这个问题并只使用第一个吗?再次感谢! @CharlieEcho,您可能想要执行某种左连接。我将编辑答案,以便您更好地使用它。【参考方案2】:

怎么样:

var ans = firstDict
    .OrderBy(kv => kv.Value)
    .ThenBy(kv => ThisMethodReturnsAnotherIReadOnlyDict<int,int>().TryGetValue(kv.Key, out var val2) ? val2 : kv.Key)
    .ToList();

除非ThisMethodReturnsAnotherIReadOnlyDict&lt;int,int&gt; 可能发生变化,否则您可能希望在排序前将返回值缓存在一个变量中。

【讨论】:

以上是关于按其他字典的结果排序字典的主要内容,如果未能解决你的问题,请参考以下文章

按字典顺序排序字符串c ++

将嵌套字典按内部值排序

python 字典排序

字典去重冒泡排序

使用 tie 元素按值排序字典不应更改其顺序

对输入的正文按字典顺序取最大或最小的行输出,输出的结果由一个函数的参数来决定,为1,则为最大行输出,