我有一个默认的C#对象列表。它们都是RGB格式,这意味着,对于黑色,例如,看起来像0, 0, 0
。是否有可能找到此列表的“最大”和“最小”值?我的意思是,在这个颜色列表中找到最不强烈或最强烈的颜色,有点像整数列表中的list.Maximum
。试图谷歌没有给我任何东西,尝试使用Intellisense只给了我这些选择:
答案 0 :(得分:1)
如果您为每种颜色计算此值并采用具有最高值的颜色,则结果为:
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();
答案 1 :(得分:0)
Interactive Extensions(以及其他几个库)包含一个MaxBy()
函数,可以让您找到具有指定函数的maxiumum值的颜色。
例如,要在列表中找到最蓝色的颜色:
// Update: Forgot MaxBy returns a list of all elements with the max value
var bluest = colors.MaxBy(c => c.B)[0];
或者,如果您不想使用其实施,则可以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)
。