Substituição de para... se a matriz de iteração
Pergunta
Eu amo lista de compreensões em Python, porque eles, de forma concisa de representar uma transformação de uma lista.
No entanto, em outras línguas, eu freqüentemente me encontro a escrever algo ao longo das linhas de:
foreach (int x in intArray)
if (x > 3) //generic condition on x
x++
//do other processing
Este é o exemplo em C#, onde tenho a impressão de LINQ pode ajudar com isso, mas é comum a construção de programação, que pode substituir este um pouco menos do que a solução elegante?Talvez uma estrutura de dados não estou pensando?
Solução
O incremento no original foreach
o loop não irá afetar o conteúdo da matriz, a única forma de o fazer continua a ser um for
loop:
for(int i = 0; i < intArray.Length; ++i)
{
if(intArray[i] > 3) ++intArray[i];
}
O Linq não é seu propósito modificar coleções existentes ou sequências.Ele cria novas seqüências com base nos já existentes.É possível obter o código acima usando o Linq, que é um pouco contra suas finalidades:
var newArray1 = from i in intArray select ((i > 3) ? (i + 1) : (i));
var newArray2 = intArray.Select(i => (i > 3) ? (i + 1) : (i));
Usando where
(ou equivalente), como mostrado em algumas das outras respostas, serão excluídos quaisquer valores menor ou igual a 3, a partir da sequência resultante.
var intArray = new int[] { 10, 1, 20, 2 };
var newArray = from i in intArray where i > 3 select i + 1;
// newArray == { 11, 21 }
Há um ForEach
método de matrizes que irá permitir que você use uma função lambda em vez de um foreach
o bloco, que para nada mais do que uma chamada de método que eu iria ficar com foreach
.
intArray.ForEach(i => DoSomething(i));
Outras dicas
Em C# você pode aplicar o processamento seletivo em qualquer coisa que vive dentro de um IEnumerable como este:
intArray.Where(i => i > 3).ConvertAll();
DoStuff(intArray.Where(i => i 3));
Etc..
Em Python, você tem filtro e mapa, que podem então, o que você deseja:
map(lambda x: foo(x + 1) filter(lambda x: x > 3, intArray))
Há também lista de compreensões o que pode fazer tanto com uma simples declaração:
[f(x + 1) for x in intArray if x > 3]
em Ruby:
intArray.select { |x| x > 3 }.each do |x|
# do other processing
end
ou se o "processamento" é uma curta-forro:
intArray.select { |x| x > 3 }.each { |x| something_that_uses x }
por último, se você deseja retornar um novo array contendo os resultados do processamento dos elementos maior que 3:
intArray.select { |x| x > 3 }.map { |x| do_something_to x }
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
Depende do idioma e o que você precisa fazer, um "mapa", como é chamado em muitos idiomas pode ser o que você está procurando.Eu não sei C#, mas de acordo com este página .NET 2.0 chamadas de "mapa do ConvertAll".
O significado de "mapa" é muito simples - fazer uma lista, e aplica uma função a cada elemento do mesmo, retornando uma nova lista.Você pode também estar à procura de "filtro", que iria fornecer-lhe uma lista de itens que satisfazem um predicado em outra lista.