C#: ключевое слово 'по умолчанию' с Дженериками

A tidyverse возможность. Мы создаем row_index с использованием row_number и преобразуем кадр данных в длинный формат (gather), группируя по row мы filter группы, которые имеют верхние 2 значения «a» или «b», и преобразуем данные обратно в широкоформатный формат (spread).

library(tidyverse)

my.df %>%
   mutate(row = row_number()) %>%
   gather(key, value, -row) %>%
   group_by(row) %>%
   filter(any(key[order(value, decreasing = TRUE)[1:2]] %in% c("a", "b"))) %>%
   spread(key, value)

#    row     a     b     c     d     e
#  <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1  6.40  5.32  5.37  5.10  3.71
#2     2  6.72  4.79  3.52  4.26  4.53
#3     3  6.08  5.36  5.61  5.44  5.30
#4     4  7.01  5.28  4.80  4.36  6.75
#5     5  5.00  6.16  6.06  2.41  6.17
#6     6  6.30  3.29  5.74  4.70  4.75
#7    10  5.50  4.40  3.98  6.20  4.50

Я специально сохранил столбец row, чтобы мы знали, что строка 7-9 удалена, и если она не нужна, мы можем удалить ее с помощью ungroup() %>% select(-row).

7
задан Andreas Grech 10 April 2009 в 14:26
поделиться

2 ответа

Если SerializableEntity является типом значения, оно никогда не может быть пустым , Поэтому тело вашего оператора if всегда будет выполняться, поскольку оно проверяет null . Ключевое слово default вернет значение по умолчанию универсального типа. Для ссылочных типов значением по умолчанию является null . Для типов значений это ноль (или любой другой ноль, представленный для этого типа значения).

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

List<UnSerializableEntity> ToListOfUnserializables(List<SerializableEntity> entityList)
    where SerializableEntity : class
13
ответ дан 6 December 2019 в 11:52
поделиться

Ответ Кента точен, но чтобы более подробно ответить на ваш вопрос о Resharper и почему он жалуется:

В случае ссылочного типа (класса) проверки на null будет достаточно, поскольку это считается значением "по умолчанию" для ссылочного типа. Однако для типа значения (такого как структура) "default" НИКОГДА не будет нулевым. Следовательно, поскольку ваши SerializableEntity и UnSerializableEntity являются универсальными, вы можете указать их как ссылочные типы, так и типы значений, поэтому выполняемая вами нулевая проверка, вероятно, не то, что вы хотите. Что вы хотели бы проверить, так это убедиться, что параметр - это то, чем вы действительно хотите заниматься. В случае ссылочного типа вы не хотите беспокоиться о нулевых объектах. В случае типа значения вы не хотите беспокоиться об «обнуленном» значении.

Например: Допустим, вы указали DateTime как тип данных, с которым вы имеете дело.Вы действительно хотите добавить DateTimes, для которых не установлено никакого значения? Значение по умолчанию для DateTime - 1/1/0001, а не null, поэтому вам нужно будет проверить это, используя if (! Equals (e, default (SerializableEntity))) not if ( e! = null)

4
ответ дан 6 December 2019 в 11:52
поделиться
Другие вопросы по тегам:

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