比较两个字典并使用Linq确定最小值

我正在尝试找出一种方法,使用Linq相互比较两个字典,并为DictB中的键确定DictA中的最小值。

DictA: { 1,"Ron" },{ 3,"Alice" }
DictB: { 1,9 },{ 2,7 },10 },{ 4,8 },{ 5,12 }

假设两个字典上的键都是代表用户及其分数的唯一ID,我希望能够确定在DictA中用户中得分最低的用户,即用户1"Ron")得分为9。

我假设它必须是类似以下内容的东西:

var pLoser = DictA[
    DictB
        .Where(x => DictA.ContainsKey(x.Key))
        .Aggregate((l,r) => l.Value < r.Value ? l : r)
        .Key
    ];

我想知道这是否是实现我想要的东西的正确方法,或者是否有更好的方法来做到这一点。

xy080121 回答:比较两个字典并使用Linq确定最小值

我想我会这样做-可能更快,但似乎最好-按值顺序检查是否存在,并选择第一个:

var pLoser = DictA[
  DictB
    .OrderBy(x => x.Value) // lowest values first
    .Where(x => DictA.ContainsKey(x.Key))
    .FirstOrDefault()
    .Key
];

这应该利用linq的惰性来完成最少的工作来解决问题。

,

似乎join是这里的自然解决方案:

var lowestScore = 
    (from a in dictA
    join b in dictB on a.Key equals b.Key
    orderby b.Value
    select new {Name = a.Value,Score = b.Value}).First()
,

一种方法是使用Join,然后将结果投影到具有一些常识属性名称的匿名类型,然后按分数排序并获取第一个返回的值。假设总会有一个返回值,但是如果并非总是如此,您也可以使用FirstOrDefault而不是First

var lowestScore = DictA.Join(DictB,entryA => entryA.Key,entryB => entryB.Key,(entryA,entryB) => new {Id = entryA.Key,Name = entryA.Value,Score = entryB.Value})
    .OrderBy(x => x.Score)
    .First();

请注意,如果最后一位有竞争得分,并且您想将所有得分都归还,那么使用GroupBy会更有意义。

本文链接:https://www.f2er.com/3093177.html

大家都在问