Замена for ... if итерация массива

Мне нравится понимание списков в Python, потому что они кратко представляют преобразование списка.

Однако на других языках я часто пишу что-то вроде:

foreach (int x in intArray)
  if (x > 3) //generic condition on x
    x++ 
    //do other processing

Этот пример написан на C#, и я считаю, что LINQ может в этом помочь, но есть ли какая-нибудь общая программная конструкция, которая может заменить это немного менее элегантное решение? Возможно, я не рассматриваю структуру данных?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
590
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

В зависимости от языка и того, что вам нужно сделать, «карта», как она называется на многих языках, может быть тем, что вы ищете. Я не знаю C#, но, согласно странице это, .NET 2.0 вызывает карту «ConvertAll».

Значение слова «карта» довольно простое - возьмите список и примените функцию к каждому его элементу, возвращая новый список. Вы также можете искать «фильтр», который даст вам список элементов, удовлетворяющих предикату из другого списка.

в Ruby:

intArray.select { |x| x > 3 }.each do |x|
  # do other processing
end

или если «другая обработка» является коротким однострочником:

intArray.select { |x| x > 3 }.each { |x| something_that_uses x }

наконец, если вы хотите вернуть новый массив, содержащий результаты обработки этих элементов больше 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }

В Python у вас есть фильтр и карта, который может так, как вы хотите:

map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))

Также есть составить список, который может делать и то, и другое в одном простом выражении:

[f(x + 1) for x in intArray if x > 3]

В C# вы можете применять выборочную обработку ко всему, что находится внутри IEnumerable, например:

intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));

Так далее..

Ответ принят как подходящий

Приращение в исходном цикле foreach не повлияет на содержимое массива, единственный способ сделать это - цикл for:

for(int i = 0; i < intArray.Length; ++i)
{
    if (intArray[i] > 3) ++intArray[i];
}

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

var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));

Использование where (или его эквивалента), как показано в некоторых других ответах, исключает любые значения, меньшие или равные 3 из результирующей последовательности.

var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }

Существует метод ForEach для массивов, который позволит вам использовать лямбда-функцию вместо блока foreach, хотя для чего-то большего, чем вызов метода, я бы придерживался foreach.

intArray.ForEach(i => DoSomething(i));

map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))

Другие вопросы по теме