Если все элементы в списке имеют одно и то же значение, то мне нужно использовать это значение, в противном случае мне нужно использовать «otherValue». Я не могу придумать простой и понятный способ сделать это.
См. Также Аккуратный способ написания цикла со специальной логикой для первого элемента в коллекции.
Ответы:
Самый чистый способ, который я могу придумать. Вы можете сделать его однострочным, вставив val, но First () будет оцениваться n раз, что удвоит время выполнения.
Чтобы включить поведение «пустой набор», указанное в комментариях, вы просто добавляете еще одну строку перед двумя указанными выше:
источник
.Any
перечисления преждевременно завершить работу в случаях, когда есть разные значения?All
завершится, как только попадет в элементx
последовательности, для которойx.Value != val
. Точно так жеAny(x => x.Value != val)
завершится, как только он попадет в элементx
последовательности, для которойx.Value != val
. То есть обаAll
иAny
демонстрируют «короткое замыкание», аналогичное&&
и||
(которое фактически является тем, чтоAll
иAny
есть).return yyy.Skip(1).All(x=>x.Value == val) ? val : otherValue;
Хороший быстрый тест для всех равных:
источник
Class
, хотя должно работать со структурами. Однако отлично подходит для списка примитивов.collection.Distinct().Count() <= 1
если хотите разрешить пустые коллекции..Distinct()
не всегда работает должным образом - особенно когда вы работаете с объектами, см. Этот вопрос. В таких случаях вам необходимо реализовать интерфейс IEquatable.Distinct
неCount
будет вообще обходить коллекцию, а будет делать один обход черезDistinct
итератор.Хотя вы, конечно, можете построить такое устройство из существующих операторов последовательности, в этом случае я был бы склонен написать это как пользовательский оператор последовательности. Что-то вроде:
Это довольно ясно, кратко, охватывает все случаи и не создает лишних итераций последовательности.
Превращение этого в общий метод, который работает,
IEnumerable<T>
остается в качестве упражнения. :-)источник
other
когдаnull
действительно был (предположительно) правильный ответ. Скажем, функция былаT Unanimous<U, T>(this IEnumerable<U> sequence, T other)
или какая-то такая подпись, это немного усложняет.Или, если вы беспокоитесь о выполнении First () для каждого элемента (что может быть допустимой проблемой производительности):
источник
Это может быть поздно, но расширение, которое работает как для значений, так и для ссылочных типов, на основе ответа Эрика:
источник
источник
Альтернатива использованию LINQ:
Я обнаружил, что использование
HashSet<T>
списков до ~ 6000 целых чисел выполняется быстрее, чем:источник
HashSet<T>
оно изначально быстрее, чем использование операторов LINQ в моем ответе. Однако если я сделаю это в цикле, LINQ будет быстрее.GetHashCode()
, что трудно сделать правильно Смотрите: stackoverflow.com/a/371348/2607840 для более подробной информации.Небольшая вариация вышеупомянутого упрощенного подхода.
var result = yyy.Distinct().Count() == yyy.Count();
источник
Если массив имеет многомерный тип, как показано ниже, мы должны написать linq для проверки данных.
Пример: здесь элементы равны 0, и я проверяю, что все значения равны 0 или нет.
ip1 =
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
источник