Я создаю такой массив:
array<UInt16>^ temp = gcnew array<UInt16>(1000);
Как определить, заполнен ли весь массив нулем или нет.
Я думаю, что смогу использовать TrueForAll (T), но я не уверен.
Ну, я не написал функцию, единственный ответ, который я могу придумать, - это зациклить весь массив и проверить каждый элемент. Я считаю, что может быть способ получше. На самом деле я должен добавить это к вопросу
TrueForAll (T) также выполняет итерацию по всему массиву, но останавливается, если определенное вами условие оценивается как ложное. У тебя должно получиться хорошо с этим.
@GPPK Да, вы должны добавить то, что вы пробовали, и где именно вы застряли. В частности, покажите, где то, что вы пробовали, не работает так, как вы этого ожидали.
Почему вы отметили C#, но разместили код C++?
@DavidG, потому что есть много общего с C++ CLI с точки зрения того, что вы можете и не можете делать с .NET, я считаю ... Хотя не стесняйтесь удалять C#, если Im неверен.
Что ж, это было неразумно, учитывая, что синтаксический сахар, который вы получили в ответах, вам совсем не помогает. В C++ / CLI нет лямбда-выражений. Вам придется выбрать очевидный и простой подход, цикл for еще не стал устаревшим и никоим образом не менее эффективен. На самом деле намного, много эффективнее.
инициализировать счетчик с 0, затем использовать цикл for для взаимодействия с массивом и увеличения счетчика всякий раз, когда он находит 0, и в конце сравнить счетчик с размером массива, если он равен, он имеет все нули
Вам не нужно проходить через весь массив, вы можете просто выйти, если найдете что-то, что не равно нулю.
Это должно работать правильно (здесь я использовал LINQ):
IEnumerable<int> values = new List<int>(); // Or use any array type instead of List.
... Add your values here ...
var allAreZero = !values.Any(v => v != 0);
P.S. класс массива наследует IEnumerable
.
А вот решение с foreach
:
var isAllZero = true;
foreach (var value in values)
{
if (value != 0)
{
isAllZero = false;
break;
}
}
На самом деле разница между TrueForAll
и моим кодом LINQ
заключается в следующем: код LINQ
использует плавный (или, возможно, также запрос) синтаксис, где TrueForAll
- это обычная функция, в которой вы отправляете массив в качестве параметра.
Разве LINQ не медленнее, чем собственное решение?
Скорость не была заявленным требованием.
All
немного лучше для таких сценариев. var allAreZero = values.All(v => v == 0);
Ничего страшного, но это избавляет вас от необходимости отключать Any
, что означает, что он немного более читабелен.
@ alexanders916 Зачем? Все это происходит зацикливанием списка, или что вы подразумеваете под родным способом?
@ alexanders916 Я не уверен, что LINQ медленнее, вы можете протестировать его с помощью методов StopWatch
. В любом случае, пожалуйста, проверьте мои изменения
@ JᴀʏMᴇᴇ, я не думаю, что All
лучше, при этом он будет перебирать все элементы, даже если найдет ненулевой элемент. с моим кодом он вернет выходы, когда найдет ненулевой элемент
@HimBromBeere Я имел в виду решение LINQ ... способ с IEnumerable тоже хорош, но тогда проще использовать TrueForAll (T), потому что он служит той же цели с одной строкой кода.
@MohammedNoureldin - нет, не будет.
@MohammedNoureldin - хорошо, если он встретил элемент, который не удовлетворяет условию, можно с уверенностью сказать, что не элементы все будут удовлетворять условию - так что он получил хороший и ранний ответ.
Правильность @Polyfun также не указана, значит ли это, что она не имеет отношения к?
@ AntonínLejsek - бессмысленный комментарий, не будьте излишне педантичны.
Похоронен в земле комментариев, но я принял этот комментарий, потому что он решает мою проблему в мире C++ / CLI. Это была моя ошибка в исходном вопросе, чтобы пометить это с помощью C#, однако я думаю, что другие ответы, вероятно, решат это намного лучше.
var allElementsAreZero = temp.All(o => o == 0);
Просто как тот.
Он вернется, когда найдет тот, который не удовлетворяет условию, поэтому не обязательно перебирать всю вашу коллекцию:
«Перечисление источника прекращается, как только может быть определен результат».
https://msdn.microsoft.com/en-us/library/bb548541(v=vs.110).aspx
Это будет проходить через весь массив, я бы использовал Any для немедленного возврата, когда будет найдено любое ненулевое значение
Хорошо, правильно, я просто думал по-другому. Тогда All
- лучшее решение. +1
Ваш способ не ошибся и не менее эффективен - это хороший ответ, просто я предложил All
, так как он немного более читаемый.
В заключение, создатели вопросов предложили TrueForAll (T) решает его проблему.
Этот вывод зависит от версии: stackoverflow.com/a/4970507/1017882 Итак, я оставлю свой ответ, поскольку он будет становиться все более и более актуальным.
Читая Спецификация C++ / CLI, он был заполнен 0s, потому что вы создали его с помощью «new-expression», а значение по умолчанию для типа элемента равно 0.
24.2 CLI array creation
CLI array instances are created by new-expressions containing gcnew (§15.4.6) or …
Elements of CLI arrays created by new-expressions are always initialized to their default value.
Почему ты не уверен? Разве это не работает с предложенной вами функцией?