Ho il seguente metodo di estensione per trovare un elemento all'interno di una sequenza e quindi restituire due IEnumerable<T>
s: uno contenente tutti gli elementi precedenti a quell'elemento e uno contenente l'elemento e tutto ciò che segue. Preferirei se il metodo fosse pigro, ma non ho trovato un modo per farlo. Qualcuno può venire con una soluzione?Sequenza di partizione lenta con LINQ
public static PartitionTuple<T> Partition<T>(this IEnumerable<T> sequence, Func<T, bool> partition)
{
var a = sequence.ToArray();
return new PartitionTuple<T>
{
Before = a.TakeWhile(v => !partition(v)),
After = a.SkipWhile(v => !partition(v))
};
}
Facendo sequence.ToArray()
sconfigge immediatamente il requisito pigrizia. Tuttavia, senza quella linea, uno sequence
costoso da iterare può essere ripetuto due volte. E, a seconda di ciò che fa il codice chiamante, molte più volte.
'partition (v)' sarà sempre 'true' dopo il punto di divisione? – Jacob
No. Si può presumere che 'partition (v)' restituirà 'true' zero o una volta. – moswald
Non sono sicuro di quale tipo di pigrizia vuoi? Quando si suppone essere chiamato 'sequence.ToArray()'? (Quale fase della richiesta del chiamante?) – Agat