J'ai essayé cela avec la boucle Foreach, un nouveau tableau et fonctionne, mais je veux apprendre et voir s'il existe une meilleure façon de le faire avec LINQ lambda.
J'ai une table de fruits comme celle-ci p >
id fruit1 fruit2 fruit3 1 Apple Kiwi 2 Lime 3 Watermelon 4 Oranges Grapes
D'une manière ou d'une autre, tous les champs de fruits de la table n'ont pas été remplis, par exemple:
id fruit1 fruit2 fruit3 1 Apple Kiwi 2 Lime 3 Watermelon 4 Oranges Grapes
Besoin d'une sortie comme:
public class fruits { string id {get;set;} string fruit1 {get;set;} string fruit2 {get;set;} string fruit3 {get;set;} }
a essayé l'étape suivante pour que cela fonctionne
Je voudrais savoir s'il existe une meilleure façon de faire cela avec LINQ lambda.
merci
4 Réponses :
Merci de votre aide
Linq-operations Sélectionnez , Ignorer et FirstOrDefault :
var projection = fruitses.Select(r=> new fruits { id = r.id, fruit1 = new List<string>(){r.fruit1, r.fruit2, r.fruit3} .FirstOrDefault(s=>!string.IsNullOrEmpty(s)), fruit2 = new List<string>(){r.fruit2, r.fruit3} .Skip(r.fruit1==null?1:0) .Skip(r.fruit2==null?1:0) .FirstOrDefault(s=> !string.IsNullOrEmpty(s)), fruit3 = new List<string>(){r.fruit3} .Skip(r.fruit1==null?1:0) .Skip(r.fruit2==null?1:0) .FirstOrDefault(s=> !string.IsNullOrEmpty(s)) });
Merci pour l'aide
Je commencerais par faire une liste de ces fruits pour que vous puissiez en faire quelque chose. de préférence, vous les stockez dans une liste pour commencer;
ajoutez une propriété fruits qui renvoie les fruits sous forme de liste.
fruitList.ForEach(s => s.fruits = s.fruits.Where(x => !string.IsNullOrEmpty(x)).ToList());
donc en prenant une liste de l'objet Fruits :
List<Fruits> fruitList = {...};
Vous pouvez alors supprimer tous les fruits là où il n'y a rien, créant ainsi une liste sans espaces vides.
public List<string> fruit { get { return new List<string> { this.fruit1, this.fruit2, this.fruit3 };} set { this.fruit1 = value.ElementAtOrDefault(0); this.fruit2 = value.ElementAtOrDefault(1); this.fruit3 = value.ElementAtOrDefault(2); } }
Cependant, cette liste peut être plus courte que la liste précédente car toutes les chaînes vides sont supprimées. Nous devons donc vérifier si la valeur à l'index approprié existe toujours. Nous faisons cela avec ElementAtOrDefault , ce retourne null s'il n'y a pas de valeur présente à l'index.
Vous devez cependant noter que ce n'est pas une manière durable de garder ces objets comme u devra créer plus de propriétés de fruits pour chaque augmentation du nombre de fruits que vous souhaitez conserver d'affilée. il serait donc préférable de simplement stocker ces fruits dans une liste pour commencer et de contourner tous ces problèmes.
Merci de votre aide
Une autre approche avec Linq
foreach (fruits item in fruitarray) { var columns = new[] { item.fruit1, item.fruit2, item.fruit3 }.Where(y => !string.IsNullOrEmpty(y)); item.fruit1 = columns.ElementAtOrDefault(0); item.fruit2 = columns.ElementAtOrDefault(1); item.fruit3 = columns.ElementAtOrDefault(2); }
https: / /dotnetfiddle.net/OXYWpW
la meilleure approche imo avec boucle
fruits[] output = input.Select(x => { var items = new[] { x.fruit1, x.fruit2, x.fruit3 }.Where(y => !string.IsNullOrEmpty(y)); return new fruits() { id = x.id, fruit1 = items.ElementAtOrDefault(0), fruit2 = items.ElementAtOrDefault(1), fruit3 = items.ElementAtOrDefault(2) };}).ToArray();
Quelle est la règle pour affecter un fruit à une colonne particulière?
#aubury par une colonne spécifique, je voulais dire f1, f2, f3.