2014-01-09 4 views
1

У меня есть список объектов C# по умолчанию. Все они в формате RGB, то есть для черных, например, выглядит так: 0, 0, 0. Можно ли найти «максимальное» и «минимальное» значение этого списка? Я имею в виду, нахожу наименьший интенсивный или самый интенсивный цвет в этом списке цветов, вроде как list.Maximum в списке целых чисел. Попытка Google не дал мне ничего, и пытается использовать Intellisense только дал мне эти варианты:Поиск «максимального» или «минимального» цвета в списке цветов?

enter image description here

+0

Являются ли они несопоставимыми? –

+0

Прошу прощения, я не совсем уверен, что это значит. – theGreenCabbage

+0

Включите ли объекты C# в свой список интерфейс 'System.IComparable'? –

ответ

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(); 
+0

Был ли я создан метод, который будет проходить через весь список, преобразует каждый в значения интенсивности, а затем найдет max? – theGreenCabbage

+0

Эй, дверной стаж. Я получаю красную подчеркивание под 'Max()' следующим образом: http://puu.sh/6fhR5/0efde4bbbb.png – theGreenCabbage

+1

Поместите это в начало файла: using System.Linq; – doorstuck

0

Interactive Extensions (и несколько других библиотек) включают функцию MaxBy(), которая позволит вам найти цвет с максимальным значением указанной функции.

Например, чтобы найти самый синий цвет в списке:

// 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).

+0

Поскольку это плагин, который работает в части программного обеспечения под названием Grasshopper 3D, я бы хотел избежать внешних библиотек. Но - спасибо за предложение! Если у меня закончится выбор, я буду использовать это. – theGreenCabbage

+0

Ix - это с открытым исходным кодом, поэтому вы можете брать (с атрибуцией!) Их реализацию: http://rx.codeplex.com/SourceControl/latest#Ix.NET/Source/System.Interactive/EnumerableEx.Aggregates.cs – dahlbyk

+0

Ooh awesome - благодаря! – theGreenCabbage

Смежные вопросы