sto cercando di normalizzare catene arbitrarie di .Skip()
e .Take()
chiamate a una singola chiamata .Skip()
seguita eventualmente da un singolo .Take()
chiamata.catene Normalizzazione di .Skip() e .Prendere() chiama
Ecco alcuni esempi di risultati attesi, ma non sono sicuro se questi sono corretti:
.Skip(5) => .Skip(5)
.Take(7) => .Skip(0).Take(7)
.Skip(5).Skip(7) => .Skip(12)
.Skip(5).Take(7) => .Skip(5).Take(7)
.Take(7).Skip(5) => .Skip(5).Take(2)
.Take(5).Take(7) => .Skip(0).Take(5)
.Skip(5).Skip(7).Skip(11) => .Skip(23)
.Skip(5).Skip(7).Take(11) => .Skip(12).Take(11)
.Skip(5).Take(7).Skip(3) => .Skip(8).Take(4)
.Skip(5).Take(7).Take(3) => .Skip(5).Take(4)
.Take(11).Skip(5).Skip(3) => .Skip(8).Take(3)
.Take(11).Skip(5).Take(7) => .Skip(5).Take(6)
.Take(11).Take(5).Skip(3) => .Skip(3).Take(2)
.Take(11).Take(5).Take(3) => .Skip(0).Take(3)
Qualcuno può confermare questi sono i risultati corretti che si possono attendere?
Ecco l'algoritmo di base che ho derivato dagli esempi:
class Foo
{
private int skip;
private int? take;
public Foo Skip(int value)
{
if (value < 0)
value = 0;
this.skip += value;
if (this.take.HasValue)
this.take -= value;
return this;
}
public Foo Take(int value)
{
if (value < 0)
value = 0;
if (!this.take.HasValue || value < this.take)
this.take = value;
return this;
}
}
Qualsiasi idea di come posso confermare se questo è l'algoritmo corretto?
Per curiosità, a cosa serve? –
@NickLarsen: sto implementando un provider di query LINQ e devo trasformare Skip and Take in una singola coppia offset/conto. – dtb
Non sai come si comportano, ma seguendo la logica presunta credo che dovresti avere .Skip (5) .Take (7) .Take (3) => .Skip (5) .Take (3) (che è prendere 3 e non 4). Il codice sembra dare questo valore, che ritengo sia corretto – rslite