Substituto para a ... se iteração variedade

votos
7

Eu amo compreensões lista em Python, porque eles concisa representam uma transformação de uma lista.

No entanto, em outros idiomas, encontro-me frequentemente escrever algo ao longo das linhas de:

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

Este exemplo está em C #, onde eu tenho a impressão LINQ pode ajudar com isso, mas há alguma construção de programação comum, que pode substituir este um pouco menos do que o elegante solução? Talvez uma estrutura de dados eu não estou pensando?

Publicado 16/08/2008 em 23:28
fonte usuário
Em outras línguas...                            


6 respostas

votos
5

O incremento no original foreachcircuito não afetará o conteúdo da matriz, a única maneira de fazer isso continua a ser um forloop:

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

Linq não se destina a modificar coleções ou seqüências existentes. Ele cria novas sequências com base nos existentes. É possível alcançar o código acima usando Linq, embora seja ligeiramente contra seus propósitos:

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, irá excluir qualquer valor inferior a 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 ForEachmétodo em matrizes que permitem que você use uma função lambda em vez de um foreachbloco, embora por nada mais do que uma chamada de método eu iria ficar com foreach.

intArray.ForEach(i => DoSomething(i));
Respondeu 17/08/2008 em 01:44
fonte usuário

votos
2

Em C # você pode aplicar processamento seletivo em qualquer coisa que vive dentro de um IEnumerable assim:

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

Etc ..

Respondeu 17/08/2008 em 00:06
fonte usuário

votos
1

Em Python, você tem filtro e mapa , que assim pode o que quiser:

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

Há também compreensões lista que pode fazer tanto em um comunicado fácil:

[f(x + 1) for x in intArray if x > 3]
Respondeu 16/08/2008 em 23:56
fonte usuário

votos
0
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))
Respondeu 25/06/2011 em 12:28
fonte usuário

votos
0

em Ruby:

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

ou se "outro processamento" é um curta-liner:

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

Por último, se você quiser retornar uma nova matriz contendo os resultados do processamento desses elementos superior a 3:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
Respondeu 16/08/2008 em 23:47
fonte usuário

votos
-1

Depende da linguagem eo que você precisa fazer, um "mapa", como é chamado em muitas línguas poderia ser o que você está procurando. Eu não sei C #, mas de acordo com esta página, .NET chamadas 2.0 mapa "ConvertAll".

O significado de "mapa" é bastante simples - fazer uma lista e aplicar uma função a cada elemento do mesmo, retornando uma nova lista. Você pode também estar à procura de "filtro", que iria dar-lhe uma lista de itens que satisfazem um predicado em outra lista.

Respondeu 16/08/2008 em 23:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more