L'utilisation de Linq pour exécuter une méthode sur une collection d'objets?
C'est un long shot, je sais...
Disons que j'ai une collection
List<MyClass> objects;
et je veux exécuter la même méthode sur chaque objet de la collection, avec ou sans valeur de retour. Avant de Linq, j'aurais dit:
List<ReturnType> results = new List<ReturnType>();
List<int> FormulaResults = new List<int>();
foreach (MyClass obj in objects) {
results.Add(obj.MyMethod());
FormulaResults.Add(ApplyFormula(obj));
}
Je amour pour être en mesure de faire quelque chose comme ceci:
List<ReturnType> results = new List<ReturnType>();
results.AddRange(objects.Execute(obj => obj.MyMethod()));
//obviously .Execute() above is fictitious
List<int> FormulaResults = new List<int>();
FormulaResults.AddRange(objects.Execute(obj => ApplyFormula(obj)));
Je n'ai pas trouvé quelque chose qui va le faire. Est-il une telle chose?
Si il n'y a rien de générique, comme je l'ai posée ci-dessus, à moins peut-être il ya un moyen de le faire aux fins je travaille en ce moment: j'ai une collection d'un objet qui a une classe wrapper:
class WrapperClass {
private WrappedClass wrapped;
public WrapperClass(WrappedClass wc) {
this.wrapped = wc;
}
}
Mon code a une collection List<WrappedClass> objects
et je veux convertir un List<WrapperClass>
. Est-il intelligent de Linq façon de faire cela, sans faire le fastidieux
List<WrapperClass> result = new List<WrapperClass>();
foreach (WrappedClass obj in objects)
results.Add(new WrapperClass(obj));
Merci...
OriginalL'auteur Shaul Behr | 2009-06-23
Vous devez vous connecter pour publier un commentaire.
:
faire?
ou (plus simple)
OMG, c'était aussi simple que cela?? Merveilleux! J'AIME LINQ!!!
OriginalL'auteur Marc Gravell
Je pense que le Select() la méthode d'extension pouvez faire ce que vous êtes à la recherche pour:
Même chose pour le dernier cas:
Si vous avez un
void
méthode que vous voulez l'appeler, voici une astuce que vous pouvez utiliser avec IEnumerable, qui n'a pas un ForEach() extension, pour créer un comportement similaire, sans beaucoup d'efforts.La
Select()
va produire une séquence de[false]
valeurs après avoir invoquéSomeVoidMethod()
sur chaque[obj]
dans les objets de la séquence. DepuisSelect()
utilise l'exécution différée, nous appelons laCount()
extension de chaque élément de la séquence à être évalué. Il fonctionne très bien lorsque vous voulez quelque chose comme uneForEach()
comportement.OriginalL'auteur LBushkin
Si la méthode
MyMethod
que vous souhaitez appliquer retourne un objet de typeT
ensuite, vous pouvez obtenir unIEnumerable<T>
du résultat de la méthode via:Si la méthode
MyMethod
que vous souhaitez appliquer a le type de retourvoid
ensuite, vous pouvez appliquer la méthode via:Cela suppose que
objects
est de type génériqueList<>
. Si vous ne disposez que d'unIEnumerable<>
alors vous pouvez rouler votre propreForEach
méthode d'extension ou d'appliquerobjects.ToList()
premier et utiliser la syntaxe ci-dessus .OriginalL'auteur jason
Le compilateur C# cartes d'un LINQ sélectionnez sur la .Sélectionnez la méthode d'extension, défini dans le IEnumerable (IQueryable que nous n'aborderons pas ici). En fait, que .Sélectionnez la méthode est exactement le genre de projection en fonction de ce que vous êtes après.
LBushkin est correct, mais vous pouvez réellement utiliser la syntaxe LINQ...
OriginalL'auteur Martin
Vous pouvez également exécuter une méthode personnalisée à l'aide de la merveilleuse Jon Skeet est morelinq bibliothèque
Par exemple si vous avez une propriété de texte sur votre MyClass que vous avez besoin de changer en cours d'exécution en utilisant une méthode de la même classe:
Cette méthode va maintenant être mise en œuvre sur tous les objets de votre liste. J'aime morelinq!
OriginalL'auteur Anya Hope
http://www.hookedonlinq.com/UpdateOperator.ashx a une longue méthode de mise à Jour que vous pouvez utiliser. Ou vous pouvez utiliser une instruction select, comme affiché par les autres.
OriginalL'auteur