Рекурсия для foldr f x ys
, где ys = [y1,y2,...,yk]
похож
f y1 (f y2 (... (f yk x) ...))
, тогда как рекурсия для foldl f x ys
похожа
f (... (f (f x y1) y2) ...) yk
важное различие здесь, то, что, если результат f x y
может быть вычислен с помощью только значение x
, то foldr
не должен' исследовать весь список. Например
foldr (&&) False (repeat False)
возвраты False
, тогда как
foldl (&&) False (repeat False)
никогда не завершается. (Отметьте: repeat False
создает бесконечный список, где каждый элемент False
.)
, С другой стороны, foldl'
хвост, рекурсивный и строгий. Если Вы знаете, что необходимо будет пересечь целый список, неважно, что (например, суммируя числа в списке), то foldl'
больше пространства - (и вероятно время-) эффективный, чем [1 115].
Анонимные типы позволяют вам выбирать произвольные поля в структурах данных, которые строго типизированы позже в вашем коде:
var cats = listObject
.Select(i => new { i.category_id, i.category_name })
.Distinct()
.OrderByDescending(i => i.category_name)
.ToArray();
Поскольку вам (очевидно) нужно сохранить его для дальнейшего использования, вы можете использовать оператор GroupBy:
Data[] cats = listObject
.GroupBy(i => new { i.category_id, i.category_name })
.OrderByDescending(g => g.Key.category_name)
.Select(g => g.First())
.ToArray();
Вы можете использовать анонимный тип:
.Select(i => new { i.name, i.category_name })
Компилятор сгенерирует код для класса со свойствами name
и category_name
и вернет экземпляры этот класс. Вы также можете указать имена свойств вручную:
i => new { Id = i.category_id, Name = i.category_name }
Вы можете иметь произвольное количество свойств.
var result = listObject.Select( i => new{ i.category_name, i.category_id } )
Здесь используются анонимные типы, поэтому вы должны использовать ключевое слово var, поскольку результирующий тип выражения заранее неизвестен.
Это задача, для которой очень хорошо подходят анонимные типы . Вы можете возвращать объекты типа, который автоматически создается компилятором на основе использования.
Синтаксис имеет следующий вид:
new { Property1 = value1, Property2 = value2, ... }
В вашем случае попробуйте что-то вроде следующего:
var listObject = getData();
var catNames = listObject.Select(i =>
new { CatName = i.category_name, Item1 = i.item1, Item2 = i.item2 })
.Distinct().OrderByDescending(s => s).ToArray();
(from i in list
select new { i.category_id, i.category_name })
.Distinct()
.OrderBy(i => i.category_name);
var selectedCategories =
from value in
(from data in listObject
orderby data.category_name descending
select new { ID = data.category_id, Name = data.category_name })
group value by value.Name into g
select g.First();
foreach (var category in selectedCategories) Console.WriteLine(category);
Изменить : Сделано больше LINQ-ey!