Выберите несколько полей из списка в Linq

Рекурсия для 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].

124
задан Chet 7 December 2015 в 17:27
поделиться

6 ответов

Анонимные типы позволяют вам выбирать произвольные поля в структурах данных, которые строго типизированы позже в вашем коде:

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();
215
ответ дан 24 November 2019 в 01:06
поделиться

Вы можете использовать анонимный тип:

.Select(i => new { i.name, i.category_name })

Компилятор сгенерирует код для класса со свойствами name и category_name и вернет экземпляры этот класс. Вы также можете указать имена свойств вручную:

i => new { Id = i.category_id, Name = i.category_name }

Вы можете иметь произвольное количество свойств.

23
ответ дан 24 November 2019 в 01:06
поделиться
var result = listObject.Select( i => new{ i.category_name, i.category_id } )

Здесь используются анонимные типы, поэтому вы должны использовать ключевое слово var, поскольку результирующий тип выражения заранее неизвестен.

4
ответ дан 24 November 2019 в 01:06
поделиться

Это задача, для которой очень хорошо подходят анонимные типы . Вы можете возвращать объекты типа, который автоматически создается компилятором на основе использования.

Синтаксис имеет следующий вид:

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();
5
ответ дан 24 November 2019 в 01:06
поделиться
(from i in list
 select new { i.category_id, i.category_name })
 .Distinct()
 .OrderBy(i => i.category_name);
3
ответ дан 24 November 2019 в 01:06
поделиться
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!

25
ответ дан 24 November 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: