2009-09-11 4 views
1

Je vois quelques questions précédemment répondues sur l'ajout d'un élément à un IEnumerable en C#, mais je suis bloqué en essayant d'implémenter la solution proposée dans VB.NET.Comment puis-je ajouter un élément à IEnumerable (Of T) dans VB.NET?

Option Strict On 
Dim customers as IEnumerable(Of Customer) 
' Return customers from a LINQ query (not shown) 
customers = customers.Concat(New Customer with {.Name = "John Smith"}) 

Le code ci-dessus donne l'erreur:

Option Strict On disallows implicit conversions from Customer to IEnumerable(Of Customer)

VS2008 suggère alors à l'aide CType, mais cela se traduit dans un accident d'exécution pour moi. Qu'est-ce que je rate?

Répondre

4

Vous ne pouvez pas Concat un seul élément avec une séquence - vous Concat deux séquences ensemble, fondamentalement.

Vous avez trois options:

  • construire une séquence à partir de votre seul élément (par exemple, un tableau à un seul élément)
  • Ecrivez une méthode de bibliothèque pour faire ce que vous voulez (pourrait être difficile à VB9, qui ne dispose pas des blocs de iterator)
  • Utilisez MoreLinq, qui a déjà has this functionality

Avec l'option MoreLinq, vous pouvez appeler soit de:

item.Concat(sequence) 
sequence.Prepend(item) 

pour donner le premier élément unique, ou

sequence.Concat(item) 

pour donner le seul élément précédent.

(En regardant en arrière, je ne suis pas sûr que j'aime la item.Concat la version;. Il ajoute la méthode d'extension trop large Nous pouvons le supprimer.)

+0

Bonne réponse. J'ai des doutes aussi sur item.Concat, surtout avec Prepend faisant la même chose. Je l'enlèverais si j'étais vous ;-) –

+0

Je pense que nous le ferons, oui. –

5

Une option est d'écrire une méthode d'extension qui concats une élément unique

<Extension()> _ 
Public Function ConcatSingle(Of T)(ByVal e as IEnumerable(Of T), ByVal elem as T) As IEnumerable(Of T) 
    Dim arr As T() = new T() { elem } 
    Return e.Concat(arr) 
End Function 

... 

customers = customers.ConcatSingle(New Customer with {.Name = "John Smith"}) 
Questions connexes