4 votes

Utilisez C# Linq Lambda pour combiner les champs de deux objets en un seul, de préférence sans objets anonymes.

J'ai une classe configurée comme ceci :

 public class Summary
{
    public Geometry geometry { get; set; }
    public SummaryAttributes attributes { get; set; }
}
public class SummaryAttributes
{
    public int SERIAL_NO { get; set; }
    public string District { get; set; }
 }
public class Geometry
{
    public List<List<List<double>>> paths { get; set; }
}

et je prends une chaîne json d'enregistrements pour cet objet et je les mets là-dedans comme ça :

List<Summary> oFeatures = reportObject.layers[0].features.ToObject<List<Summary>>();

Mon objectif final est de créer un fichier csv. J'ai donc besoin d'une liste plate d'enregistrements à envoyer au rédacteur csv que j'ai. Je peux le faire :

 List<SummaryAttributes> oAtts = oFeatures.Select(x => x.attributes).ToList();

et j'obtiens une belle liste d'attributs que j'envoie au format CSV. C'est simple comme bonjour.

Ce que je veux, c'est aussi extraire un champ de l'objet Geometry et l'inclure dans ma liste finale à envoyer au format CSV. Ainsi, la liste finale destinée à l'éditeur csv contiendrait des objets avec tous les champs de SummaryAttributes. plus les première et dernière valeurs doubles du champ paths de l'objet Geometry (paths[0][0][first] et paths[0][0][last])

C'est difficile à expliquer. Je veux greffer deux attributs supplémentaires sur l'objet SummaryAttributes original. Je serais d'accord pour créer une nouvelle classe SummaryAttributesXY avec les deux champs supplémentaires si c'est ce qu'il faut. Mais j'essaie d'éviter de créer un nouvel objet anonyme et de devoir délimiter chaque champ de la classe SummaryAttributes, car il y en a beaucoup plus que ce que j'ai énuméré dans cet exemple.

Des suggestions ?

4voto

Sergey Berezovskiy Points 102044

Vous pouvez sélectionner un nouvel objet anonyme avec des champs obligatoires, mais vous devez être complètement sûr que paths a au moins un élément dans chaque niveau de listes :

var query = oFeatures.Select(s => new {
  s.attributes.SERIAL_NO,
  s.attributes.District,
  First = s.geometry.paths[0][0].First(), // or [0][0][0]
  Last = s.geometry.paths[0][0].Last()   
}).ToList()

1voto

VBAHole Points 344

Je l'ai compris. J'inclus les champs X et Y dans la définition de la classe originale. Quand le json est désérialisé, ils seront nuls. Ensuite, je reviens en boucle et je les remplis.

 List<Summary> oFeatures = reportObject.layers[0].features.ToObject<List<Summary>>();
                List<Summary> summary = oFeatures.Select(s =>
                {
                    var t = new Summary
                    {
                        attributes = s.attributes
                    };
                    t.attributes.XY1 = string.Format("{0} , {1}", s.geometry.paths[0][0].First(), s.geometry.paths[0][1].First());
                    t.attributes.XY2 = string.Format("{0} , {1}", s.geometry.paths[0][0].Last(), s.geometry.paths[0][1].First());
                    return t;
                }).ToList();
                List<SummaryAttributes> oAtts = summary.Select(x => x.attributes).ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X