J'ai une boucle foreach qui lit une liste d'objets d'un type et produit une liste d'objets d'un type différent. On m'a dit qu'une expression lambda peut obtenir le même résultat.
var origList = List<OrigType>(); // assume populated
var targetList = List<TargetType>();
foreach(OrigType a in origList) {
targetList.Add(new TargetType() {SomeValue = a.SomeValue});
}
Toute aide serait appréciée - je suis nouveau sur lambda et linq merci, s
Réponses:
Essayez ce qui suit
Cela utilise une combinaison de Lambdas et LINQ pour parvenir à la solution. La fonction Select est une méthode de style de projection qui appliquera le délégué passé (ou lambda dans ce cas) à chaque valeur de la collection d'origine. Le résultat sera retourné dans un nouveau
IEnumerable<TargetType>
. L'appel .ToList est une méthode d'extension qui le convertiraIEnumerable<TargetType>
en unList<TargetType>
.la source
TargetType
? Je me suis retrouvé avec quelque chose comme ça:List<ISearchEntity> results = myIQueryable.Select(x => (ISearchEntity) new TargetType { MyField = "Field value is " + x.TargetField }).ToList();
où le but était d'obtenir un objet de typeList<ISearchEntity>
Si vous savez que vous souhaitez convertir à partir
List<T1>
de,List<T2>
alorsList<T>.ConvertAll
sera légèrement plus efficace queSelect
/ToList
car il connaît la taille exacte pour commencer:Dans le cas plus général, lorsque vous ne connaissez la source qu'en tant que
IEnumerable<T>
, l'utilisation deSelect
/ToList
est la voie à suivre. Vous pourriez également faire valoir que dans un monde avec LINQ, c'est plus idiomatique pour commencer ... mais cela vaut au moins la peine d'être au courant de l'ConvertAll
option.la source
IEnumerable<T>
alors appelezSelect
etToList
selon la réponse de Jared.x => buildTargetType(x)
la source
cannot cast expression
exceptionla source
Je crois que quelque chose comme ça devrait fonctionner:
la source
.ToList()
à la fin, sinon cela fournira simplement un IEnumerable.Voici un exemple simple ..
la source
la source
Supposons que vous ayez plusieurs propriétés à convertir.
la source
Ou avec un
constructor
&linq
avecSelect
:La
Linq
ligne est plus douce! ;-)la source
Si vous devez utiliser une fonction pour caster:
Où est ma fonction personnalisée:
la source
pour une classe de type similaire.
List<targetlist> targetlst= JsonConvert.DeserializeObject<List<targetlist>>(JsonConvert.SerializeObject(<List<baselist>));
la source
Si les types peuvent être directement convertis, c'est la façon la plus simple de le faire:
Si les types ne peuvent pas être directement castés, vous pouvez mapper les propriétés du type d'origine au type cible.
la source
Nous considérerons que le premier type de List est String et nous voulons le convertir en type Integer de List.
Ajoutez des valeurs dans la liste d'origine.
Créer une liste cible de type entier
Imprimer les valeurs de liste à l'aide de forEach:
la source