Vra

Ek is mal lys begripstoetse in Python, omdat hulle saaklik 'n transformasie van 'n lys voor te stel.

Maar in ander tale, ek gereeld vind myself skryf iets in die trant van:

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

Hierdie voorbeeld is in C #, waar ek onder die indruk LINQ kan help met hierdie, maar is daar 'n paar algemene ontwikkeling konstruk wat dit kan vervang effens minder-as-elegante oplossing? Miskien 'n datastruktuur ek nie oorweeg?

Was dit nuttig?

Oplossing

Die inkrement in die oorspronklike foreach lus sal geen invloed op die inhoud van die skikking, die enigste manier om dit te doen bly 'n for lus:

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

Linq is nie bedoel om bestaande versamelings of rye verander. Dit skep nuwe reekse gebaseer op bestaande. Dit is moontlik om die bogenoemde kode met behulp van Linq bereik, al is dit effens teen sy doeleindes:

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

Die gebruik van where (of ekwivalent), soos getoon in 'n paar van die ander antwoorde, sal enige waardes minder as of gelyk aan 3 uitsluit uit die gevolglike ry.

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

Daar is 'n ForEach metode op skikkings wat jou sal toelaat om 'n lambda funksie te gebruik in plaas van 'n foreach blok, al vir niks meer as 'n metode oproep Ek wil vashou aan foreach.

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

Ander wenke

In C # jy kan selektief toe te pas op enigiets wat leef en beef binnekant 'n IEnumerable soos volg:

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

Ens ..

In Python, jy het filter en te karteer , wat kan so what jy wil:

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

Daar is ook lys begripstoetse wat beide in een maklike verklaring kan doen:

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

in Ruby:

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

of as "ander verwerking" is 'n kort een-liner:

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

laastens, as jy wil 'n nuwe reeks wat die resultate van die verwerking van dié elemente groter as 3 keer:

intArray.select { |x| x > 3 }.map { |x| do_something_to x }
map(lambda x: test(x + 1) filter(lambda x: x > 3, arr))

Dit hang af van die taal en wat jy hoef te doen, 'n "kaart" soos dit genoem word in baie tale kan wees wat jy soek vir. Ek weet nie C #, maar volgens hierdie bladsy, NET 2.0 oproepe te karteer "ConvertAll".

Die betekenis van "kaart" is eenvoudig - neem 'n lys, en 'n funksie is van toepassing op elke element daarvan, terugkeer 'n nuwe lys. Jy kan ook op soek na "filter", wat jy 'n lys van items wat 'n gesegde bevredig in 'n ander lys sal gee.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top