Nano Hash - криптовалюты, майнинг, программирование

Linq OrderBy Значение атрибута и группа

В основном у меня есть таблица с заголовками, которые я читаю из БД, используя linq в С#. Из этих заголовков всегда есть хотя бы один, который всегда один и тот же; Тотал и я хочу, чтобы он всегда был справа.

Итак, вот как устроены мои данные:

Data
{
   Label,
   Value,
   Age  //Not used initially
}

Образец данных:

{"Dog", 7}
{"Cat", 3}
{"Other", 4}
{"Total", 14}

Я хотел бы заказать этикетки в этом порядке; фактические имена животных сортируются по их значению в порядке убывания, а в конце добавляется «Итого»:

"Dog", "Other", "Cat", "Total"

Как мне это сделать в Linq. Как упорядочить атрибут на основе значения другого атрибута?

Когда у меня есть порядок заголовков, есть ли простой способ упорядочить будущие строки на основе уже определенного порядка. Если я хочу сначала найти заголовки where(x=>x.Age > 20), как я могу отсортировать метки в where(x=>x.Age ‹= 20) на основе того же порядка, что и набор >20?

28.09.2010

  • почему вы храните общее количество? Разве нельзя его рассчитать, а затем просто добавить в конец списка? Тогда вы можете просто отсортировать по возрасту по убыванию. Или я что-то упускаю? 29.09.2010
  • Это упрощено. Total не является фактическим именем атрибута. И это не всегда можно вычислить суммированием. 29.09.2010

Ответы:


1

Этот запрос должен работать:

var query = from row in table
            let ignore = row.Label == "Total"
            orderby ignore, row.Value descending
            select row.Label;

//and corresponding lambda version
var lquery = table.OrderBy(row => row.Label == "Total")
                  .ThenByDescending(row => row.Value)
                  .Select(row => row.Label);

Примечание: нет необходимости создавать переменную ignore, ее можно поместить прямо в предложение orderby. Таким образом, это делает его более читабельным.

Не уверен, что вы спрашиваете в своем втором вопросе.


редактировать:
В ответ на ваш комментарий это будет зависеть от того, как вы хотите, чтобы сортировка работала, по крайней мере, так написано. Это хорошо работает, если в таблице есть только одна строка, которую вы хотите полностью игнорировать. Не так много, если у вас было более одного. Проблема в том, что среди «игнорируемых» строк также будет сортировка по исходной сортировке (в данном случае по Value). Наивный способ добавить еще одну строку — добавить условие игнорирования.

var query = from row in table
            let ignore = row.Label == "Total" || row.Label == "Cost"
            orderby ignore, row.Value descending
            select row.Label;

Чтобы иметь определенный порядок среди «игнорируемых» строк, потребуется несколько более сложный запрос:

var query = from row in table
            let ignore = row.Label == "Total" || row.Label == "Cost"
            let ignoreorder = row.Label == "Cost" ? 1 : 0
            orderby ignore, ignoreorder, row.Value descending
            select row.Label;

//and corresponding lambda version
var lquery = table.OrderBy(row => row.Label == "Total" || row.Label == "Cost")
                  .ThenBy(row => row.Label == "Cost" ? 1 : 0)
                  .ThenByDescending(row => row.Value)
                  .Select(row => row.Label);
28.09.2010
  • Как бы выглядел синтаксис, если бы у меня было более 1 столбца игнорирования. Как Итого и Стоимость. А я всегда хотел, чтобы Cost был после игнора. Кроме того, как будет выглядеть синтаксис лямбда-выражения для этого? Это решило мой первый вопрос. Спасибо. Я поработаю над вторым и, возможно, уточню в другом вопросе. 29.09.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..