2009-02-17 5 views

Répondre

2

Je ne sais pas exactement quelles sont vos exigences, en particulier le peu sur ToList ne pas faire ce que vous avez besoin.

Malheureusement, BindingList<T> accepte uniquement un paramètre IList<T> dans son constructeur et non un IEnumerable<T>.

Cependant, si vous implémentez un constructeur pass-through sur votre collection personnalisée (ou si elle a déjà un constructeur qui prend IList<T>) alors vous pourriez faire quelque chose de semblable à ceci:

public class MyListObject<T> : BindingList<T> 
{ 
    public MyListObject() : base() { } 
    public MyListObject(IList<T> list) : base(list) { } 
} 

// ... 

MyListObject<int> yourList = new MyListObject<int> { 1, 2, 3, 4, 5 }; 
yourList = new MyListObject<int>(yourList.Select(s => s * 2).ToList()); 
// yourList now contains 2, 4, 6, 8, 10 
+0

C'est ce que j'aurais utilisé sans poser la question ici. J'ai demandé à être sûr que Linq n'a pas quelque chose que je n'ai pas vu. Mais bien :) Thx pour l'entrée. +1 et la réponse –

1

La plupart des listes acceptent une plage d'objets dans le constructeur. Ça marchera?

Dim objects = 'Linq statement returning IEnumberable array. 
Dim mlo As New MyListObject(objects) 
+0

Malheureusement, BindingList seulement accepte IList dans son constructeur et non IEnumerable . – LukeH

2

Une option consiste à envelopper le IEnumerable retourné dans votre type de collection en utilisant/ajoutant constructeur qui prend IEnumerable comme Cstick suggère. Peut-être un peu plus moyen ellegant est d'ajouter une méthode d'extension pour le type IEnumerable qui renverrait votre collection:

static MyListObject ToMyList(this IEnumerable<T> en) { 
    // construct your MyListObject from 'en' somehow 
} 


// And then just write: 
var mylist = (from c in ...).ToMyList() 

La dernière option qui est probablement trop compliqué pour ce scénario est simple à mettre en œuvre tous les opérateurs de requête LINQ pour votre type (méthodes d'extension Where, Select et beaucoup d'autres). Le plus est que vous pourriez (peut-être) faire certaines choses plus efficacement, mais c'est vraiment un peu difficile à faire.

+0

Je ne comprends pas ce que vous voulez dire par "de 'en'" –

+0

ok Je vois juste que c'est votre nom de variable: P Je vais jeter un oeil, c'est un peu de ce que j'aurais voulu éviter de faire la boucle manuellement. Mais bon, si c'est le seul moyen ... –

+0

+1 pour l'idée, merci –

Questions connexes