2016-02-17 3 views
2

Le code suivant crée une instance intermédiaire de List<string> et lui ajoute des valeurs avant que yield ne le renvoie. Existe-t-il un bon moyen d'éviter la création de l'instance et le rendement renvoie directement les valeurs de la cellule?Retour au niveau de retour IEnumerable <IEnumerable <...>>

IEnumerable<IEnumerable<string>> GetStrValues() 
{ 
    ...... 
     foreach (var r in rows) 
     { 
      var row = new List<string>(); 
      foreach (var c in r.Cells()) 
      { 
       var value = getCellStr(c); 
       row.Add(value); 
      } 
      yield return row; 
     } 
    } 
} 

Répondre

7

Pour éviter de créer la liste, vous pouvez utiliser LINQ:

IEnumerable<IEnumerable<string>> GetStrValues() 
{ 
    return rows.Select(r => r.Cells().Select(getCellStr)); 
} 

Cela exécutera paresseusement, à savoir aucune liste intermédiaire ne sera créée. C'est un bon moyen d'éviter d'allouer de la mémoire dont vous n'avez pas besoin (sauf si vous allez répéter plusieurs fois sur le IEnumerable<string> intérieur, et getCellStr est cher).

+0

Curieusement, si je veux flatter le résultat comme 'IEnumerable ', devrais-je changer le premier '.Select (' à '.SelectMany ('? – ca9163d9

+0

@ dc7a9163d9: oui, c'est exactement ce que 'SelectMany' est pour, et utilise toujours l'exécution différée, donc c'est ce que vous devriez utiliser si votre intention est d'aplatir les résultats. – Groo

4

Vous pouvez obtenir une action différée par cellule en utilisant deux fonctions.

IEnumerable<IEnumerable<string>> GetStrValues() 
{ 
    ...... 
     foreach (var r in rows) 
     { 
      yield return GetCellValues(row); 
     } 
    } 
} 

IEnumerable<string> GetCellValues(Row r) 
{ 
    foreach (var c in r.Cells()) 
    { 
     yield return getCellStr(c); 
    } 
} 
+0

"Est-ce un bon moyen d'éviter la création de l'instance et de rendre les valeurs de cellules directement?" c'est la question, il suggère déjà de le faire –

+0

Je pense qu'il n'est pas un anglophone natif et il essayait de dire "*** Y at-il un bon moyen *** pour éviter de créer l'instance et le rendement retourner les valeurs de la cellule directement? ", mais peut-être que je me trompe. –

+0

Il a édité la question, mes excuses –