C# 寻找「;“最大值”;或;最低限度;颜色列表中的颜色?

C# 寻找「;“最大值”;或;最低限度;颜色列表中的颜色?,c#,list,graphics,colors,bitmap,C#,List,Graphics,Colors,Bitmap,我有一个默认C#对象的列表。它们都是RGB格式的,这意味着,例如,对于黑色,看起来是这样的0,0,0。是否可以找到此列表的“最大”和“最小”值?我的意思是,在这个颜色列表中找到最不强烈或最强烈的颜色,有点像一个列表。在一个整数列表中找到最大值。尝试谷歌并没有给我任何东西,尝试使用Intellisense只给了我以下选择: 如果您为每种颜色计算此值,并采用具有最高值的颜色,则这将是您的结果: var intensity = (0.2125 * R) + (0.7154 * G) + (0.0721

我有一个默认C#对象的列表。它们都是RGB格式的,这意味着,例如,对于黑色,看起来是这样的
0,0,0
。是否可以找到此列表的“最大”和“最小”值?我的意思是,在这个颜色列表中找到最不强烈或最强烈的颜色,有点像一个
列表。在一个整数列表中找到最大值。尝试谷歌并没有给我任何东西,尝试使用Intellisense只给了我以下选择:


如果您为每种颜色计算此值,并采用具有最高值的颜色,则这将是您的结果:

var intensity = (0.2125 * R) + (0.7154 * G) + (0.0721 * B);
通过
颜色列表
对象可以找到最大值,如下所示:

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();
var cs=新列表{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()

public static T MaxBy(此IEnumerable seq,Func选择器)
其中R:i可比较
{
返回序列聚合((x,y)=>
选择器(x)。与(选择器(y))<0?y:x)进行比较;
}

如果
seq
很大,这将比排序性能更好,排序就是
O(n lg n)

它们是IComparable吗?对不起,先生,我不太确定这意味着什么。您列表中的C对象实现了
系统.IComparable
接口吗?我不确定。。我该怎么找到呢?@TheGreencolla其实不是,问题是你还没有说你打算如何比较它们。我会创建一个方法,在整个列表中循环,将每个值转换为强度值,然后找到最大值吗?嘿,门卡住了-我在
max()下得到一条红色下划线
像这样:将其放在文件的顶部:使用System.Linq;谢谢你的帮助!看起来在找到这个值后,我仍然需要对应它所指的颜色。对不起。现在看看解决方案。如果你需要经常计算这一点,考虑保存排序后的结果列表,以便将来查找。因为这是一个插件,它在一个名为蚱蜢3D的软件中运行,所以我希望避免外部的库。但是-谢谢你的建议!如果我的选项用完了,我会使用这个。Ix是开源的,所以你可以借用(带有属性!)它们的实现:虽然我更喜欢这个,而不是LINQ to对象的等价物,但如果你不想要第三方库,你可以直接使用它。这可能有点过分了。只需使用System.Linq扩展方法。内置方法可以轻松找到最大值,但问题是找到具有最大值的元素。因此
MaxBy()
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);
}