На самом деле, там больше делегатов, чем вы ожидаете. Запрос LINQ:
var sortList = from a in this.colorCodes
orderby a.colorCode ascending
select a;
на самом деле:
var sortList = this.colorCodes.OrderBy(a => a.colorCode);
который (для LINQ-to-Objects) совпадает с:
var sortList = this.colorCodes.OrderBy(delegate (ColorData a) {
return a.colorCode;
})
При этом используется делегат для идентификации элемента для сортировки, т. Е. «С учетом ColorData, я дам вам colorCode». Обратите внимание, что многие select
использует , также включает делегат, но не в этом случае (тривиальный select a
удаляется компилятором).
В коде:
if(!this.colorCodes.Exists(
delegate(ColorData e)
{
return e.ColorCode == name;
}))
мы используем предикат; msgstr "с учетом ColorData я скажу вам, соответствует ли это, проверив имя на равенство". Обратите внимание, что name
здесь «захвачен» в делегат, который включает в себя довольно сложные приемы компиляции (я не буду их описывать).
Эффективности; трудно быть уверенным, но возможно:
Dictionary<string, ColorData> items = new Dictionary<string, ColorData>();
foreach(DataRow row in table.Rows) {
string name = row["Color"].ToString().Trim();
ColorData cData;
if (items.TryGetValue(name, out cData)) {
cData.Count++;
} else {
cData.Add(name);
colorCodes.Add(cData);
items.Add(name, cData);
}
}
Это позволяет избежать многократного дублирования и использует словарь для поиска значений, а не постоянно использует Contains / Find. Во многих случаях LINQ GroupBy
мог бы помочь, но не в этом случае, возможно.