c# - 什么是 Python 的最小值/最大值的 C# 等价物

标签 c# python

以下 Python 的最小/最大代码在 C# 中的等效性是什么:

pairs = [ (2,"dog"), (1, "cat"), (3, "dragon"), (1, "tiger") ]

# Returns the PAIR (not the number) that minimizes on pair[0]
min_pair = min(pairs, key=lambda pair:pair[0])

# this will return (1, 'cat'), NOT 1

C#的Enumerable.Min好像很接近。但是根据its MSDN doc ,它总是返回最小化值(不是原始对象)。我错过了什么吗?

编辑


请注意 - 我不倾向于通过先排序来实现这一点,因为排序 (O(nlogn)) 在计算上比找到最小值 (O(n)) 更重。

另请注意 - 字典也不是理想的方法。它无法处理存在重复键的情况 - (1, "cat") 和 (1, "tiger")。

更重要的是,字典无法处理要处理的项目是复杂类的情况。例如,使用年龄作为键在动物对象列表中找到最小值:

class Animal
{
  public string name;
  public int age;
}

最佳答案

BCL没有 MinBy 函数,但自己编写一个很容易。

public static T MinBy<T, C>(this IEnumerable<T> items, Func<T, C> projection) where C : IComparable<C> {
    return items.Aggregate((acc, e) => projection(acc).CompareTo(projection(e)) <= 0 ? acc : e);
}

您可以选择编写比我更复杂的 MinBy,以避免重新评估投影。无论如何,一旦有了 MinBy 函数,就可以轻松解决问题:

var pairs = new[] {Tuple.Create(2,"dog"), Tuple.Create(1, "cat"), Tuple.Create(3, "dragon"), Tuple.Create(1, "tiger")};
var min_pair = pairs.MinBy(e => e.Item1);

关于c# - 什么是 Python 的最小值/最大值的 C# 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10793554/

相关文章:

c# - 使用列表扩展如何检查值是否存在并且我没有超出范围?

c# - 通过将 4 个较小的数字基元类型编码为 long (Int64) 来生成唯一键

c# - 在 C# 中转换 UTC 日期/时间字符串

python - 分配给 list.extend 到 python 2.7 中的变量

python - 反转 y 轴值 - Bokeh

C# 启动模板

javascript - 未捕获的类型错误 : NaN JavaScript Sharepoint

python - 带有 oAuth 和 Python 的 Twitter Streaming API

python - 如何为极坐标图中的圆形线着色(matplotlib)

python - pandas:重命名 df 中的轴