[英]Finding the “maximum” or “minimum” color in a list of colors?
我有一个默认C#对象的列表。 它们全都是RGB格式,例如对于黑色来说,看起来像是0, 0, 0
。 是否可以找到此列表的“最大值”和“最小值”值? 我的意思是,在此颜色列表中找到最不强烈或最强烈的颜色,有点像一个列表。整数列表中的list.Maximum
。 尝试使用Google并没有给我任何好处,而尝试使用Intellisense仅给了我以下选择:
如果您为每种颜色计算该值并采用具有最高值的颜色,那么结果将是:
var intensity = (0.2125 * R) + (0.7154 * G) + (0.0721 * B);
使用Color
对象的列表查找最大值,如下所示:
var cs = new List<Color> { Color.Red, Color.Black };
var max = cs.OrderByDescending(x => (0.2125 * x.R) + (0.7154 * x.G) + (0.0721 * x.B)).First();
交互式扩展 (和其他几个库)包括MaxBy()
函数,该函数可让您查找具有指定函数最大值的颜色。
例如,要在列表中找到最蓝色的颜色:
// Update: Forgot MaxBy returns a list of all elements with the max value
var bluest = colors.MaxBy(c => c.B)[0];
或者,如果您不想使用其实现,则可以根据Aggregate()
实现MaxBy()
Aggregate()
:
public static T MaxBy<T, R>(this IEnumerable<T> seq, Func<T, R> selector)
where R : IComparable
{
return seq.Aggregate((x, y) =>
selector(x).CompareTo(selector(y)) < 0 ? y : x);
}
如果seq
大,则执行效果将优于排序O(n lg n)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.