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)
.
Если SerializableEntity
является типом значения, оно никогда не может быть пустым
, Поэтому тело вашего оператора if
всегда будет выполняться, поскольку оно проверяет null
. Ключевое слово default
вернет значение по умолчанию универсального типа. Для ссылочных типов значением по умолчанию является null
. Для типов значений это ноль (или любой другой ноль, представленный для этого типа значения).
Если вы хотите, чтобы ссылочные типы были только в качестве сущностей, вы должны установить ограничения на ваши общие параметры. Например:
List<UnSerializableEntity> ToListOfUnserializables(List<SerializableEntity> entityList)
where SerializableEntity : class
Ответ Кента точен, но чтобы более подробно ответить на ваш вопрос о Resharper и почему он жалуется:
В случае ссылочного типа (класса) проверки на null будет достаточно, поскольку это считается значением "по умолчанию" для ссылочного типа. Однако для типа значения (такого как структура) "default" НИКОГДА не будет нулевым. Следовательно, поскольку ваши SerializableEntity и UnSerializableEntity являются универсальными, вы можете указать их как ссылочные типы, так и типы значений, поэтому выполняемая вами нулевая проверка, вероятно, не то, что вы хотите. Что вы хотели бы проверить, так это убедиться, что параметр - это то, чем вы действительно хотите заниматься. В случае ссылочного типа вы не хотите беспокоиться о нулевых объектах. В случае типа значения вы не хотите беспокоиться об «обнуленном» значении.
Например: Допустим, вы указали DateTime как тип данных, с которым вы имеете дело.Вы действительно хотите добавить DateTimes, для которых не установлено никакого значения? Значение по умолчанию для DateTime - 1/1/0001, а не null, поэтому вам нужно будет проверить это, используя if (! Equals (e, default (SerializableEntity)))
not if ( e! = null)