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

标签: c# linq entity-framework-core


【解决方案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; 可能发生变化,否则您可能希望在排序前将返回值缓存在一个变量中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2021-11-27
    • 2019-09-28
    • 2017-02-02
    相关资源
    最近更新 更多