【问题标题】:Find in a list of tuples the tuple with highest Item1 value - Then remove it from the list在元组列表中查找具有最高 Item1 值的元组 - 然后将其从列表中删除
【发布时间】:2019-07-10 14:14:46
【问题描述】:

我有一个类型的元组列表:

List<Tuple<int, int>> listOfStuffs= new List<Tuple<int, int>>();

现在,考虑到我已经用一些有用的值填充了我的列表,我如何从该列表(在不同的元组中)提取包含最高 Item1 值的元组?
如果有多个匹配项,则必须只返回第一个匹配项。

这不起作用,因为它返回一个 Int 值而不是实际的元组:

Tuple<int, int> selectedTuple = listOfStuffs.Max(t => t.Item1);  

一旦我们找到了匹配项,如何将其从 listOfStuffs 中删除?

我做了以下事情,当有重复时,它似乎只从列表中删除一个元组(根据需要):

listOfStuffs.Remove(new Tuple<int, int>(selectedTuple.Item1, selectedTuple.Item2));

也许有办法将这些操作结合起来?

【问题讨论】:

  • 它以什么方式“不起作用”?你会得到什么结果?
  • 请发布更多代码,以及您遇到的具体错误或错误结果。
  • 那甚至没有编译——我只是把那行写清楚我想做什么,如果这令人困惑,也许我不应该这样做:-)
  • 如果多个元组有相同的Item1-value怎么办?
  • 已编辑问题 - 返回 Int 而不是 Tuple

标签: c# list tuples


【解决方案1】:

您可以对列表进行排序并取第一个:

var tupleWithMaxItem1 = listOfStuffs.OrderByDescending(x => x.Item1).First();

或者你可以使用MoreLinqMaxBy()扩展:

var tupleWithMaxItem1 = listOfStuffs.MaxBy(x => x.Item1);

MaxBy() 会比先排序列表更快。

【讨论】:

    【解决方案2】:

    由于Tuple 实现了IComparable,你可以使用Max 来获取Item1 值最高的Tuple:

    Tuple<int, int> Result = listOfStuffs.Max();
    

    【讨论】:

      【解决方案3】:

      您正在寻找ArgMax,它在标准 Linq 中未实现,但可以在Aggregate 的帮助下进行编码:

      Tuple<int, int> Result = listOfStuffs.Aggregate((s, a) => s.Item1 > a.Item1 ? s : a);
      

      如果几个项具有相同Item1值,我们返回第一个项;如果要返回最后一个,请将&gt; 更改为&gt;=

      Tuple<int, int> Result = listOfStuffs.Aggregate((s, a) => s.Item1 >= a.Item1 ? s : a);
      

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 2015-01-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        相关资源
        最近更新 更多