C # sostituisci foreach con for

0

Attualmente sto cercando un modo per sostituire tutti i cicli foreach con i cicli per vedere se potrei ottenere alcuni vantaggi minori in qualche codice legacy che crea una tonnellata di spazzatura.

Il problema è che ci vorranno giorni per cambiare tutto manualmente, al fine di misurare se la spazzatura rimossa inciderà negativamente sulle prestazioni, quindi ho programmato un parser per fare un semplice scambio. Il fatto è che alcuni casi usano liste di altri array e alcuni elementi. Quindi la domanda che ho è, posso leggere un file c # da un altro progetto e valutare il tipo di contenitore utilizzato per passare l'iterazione a livello di codice invece di risparmiare tempo?

Anche se è una cattiva idea, sarebbe un esperimento divertente cercare di automatizzare qualcosa del genere.

    
posta Tartarus 29.03.2017 - 07:16
fonte

2 risposte

0

Un'idea è di inserire una riga di codice prima di ogni ciclo foreach che assegna il contenitore a un IList senza cast. Se il compilatore non è in grado di dedurre che l'assegnazione deve avere esito positivo in fase di compilazione, ciò significa che non è possibile sostituirlo in modo sicuro con for , poiché il contenitore potrebbe non supportare il recupero di elementi in base all'indice intero. IList è garantito per supportare il recupero del supporto degli articoli per l'indice intero.

Non cercare di essere intelligente e renderlo un cast. Il cast può essere compilato, ma potrebbe non riuscire in fase di esecuzione. Ciò significa che puoi mantenere il codice originale, oppure devi generare un nuovo codice che gestisca questa situazione e fare qualcos'altro (in pratica eseguendo il codice foreach originale o un ciclo while su IEnumerator .)

In questo modo, dovrai inserire una riga di codice alla volta, eseguire una compilazione di prova del progetto, annullare la modifica del codice, quindi applicare la modifica del codice desiderata in base alla compatibilità di IList .

Non ho testato questa idea e non posso prevedere se questo funzionerà.

    
risposta data 29.03.2017 - 09:35
fonte
4

Questo quasi certamente non risolverà i tuoi problemi di prestazioni. Quindi, a meno che tu non stia facendo questo per puro divertimento, dovresti usare la profilazione per investigare le ragioni reali.

Ma prendendo la domanda: è possibile, ma non facile da fare. Supponi di avere un codice come questo:

var x = SomeClass.SomeMetod(a);
foreach (var item in x) { ... }

Per sapere se x è un array, un parser non è sufficiente. Dovrai eseguire una compilazione completa del progetto per risolvere il suo tipo. L'unico modo realistico è usare qualcosa come Roslyn per eseguire un'analisi e una risoluzione completa del tipo.

    
risposta data 29.03.2017 - 10:50
fonte

Leggi altre domande sui tag