Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

LINQ : encore un quizz

Voici un petit quizz à faire de tête.

Quel sera l'état de ma console à l'exécution de ce code?

class Program

{

    static void Main(string[] args)

    {

        XElement xml = new XElement("Customers",

            new XElement("Customer", new XAttribute("LN", "A"), new XAttribute("FN", "a"),

                new XElement("Orders",

                    new XElement("Order", new XAttribute("Price", 100)),

                    new XElement("Order", new XAttribute("Price", 150)))),

            new XElement("Customer", new XAttribute("LN", "B"), new XAttribute("FN", "b"),

                new XElement("Orders",

                    new XElement("Order", new XAttribute("Price", 200)),

                    new XElement("Order", new XAttribute("Price", 250)))));

 

        var q = (from c in xml.Descendants("Customer")

                let c2 = new C

                                {

                                    LN = c.Attribute("LN").Value,

                                    FN = c.Attribute("FN").Value

                                }

                select new

                            {

                                Customer = c2,

                                Orders = (from o in c.Descendants("Order")

                                        select new O {

                                            Price = decimal.Parse(o.Attribute("Price").Value),

                                            C = c2 })

                            });

 

        var customers = (from c in q

                        select c.Customer).ToList();

        var orders = (from co in q

                      from o in co.Orders

                      select o).ToList();

 

        foreach (var c in customers)

            Console.WriteLine(c.Orders.Count);

        Console.ReadLine();

    }

}

 

class C

{

    private List<O> _orders;

    public C()

    {

        Id = Guid.NewGuid();

    }

    public Guid Id { get; private set; }

    public string LN { get; set; }

    public string FN { get; set; }

    public List<O> Orders

    {

        get

        {

            if (_orders == null)

                _orders = new List<O>();

            return _orders;

        }

    }

}

class O

{

    private C _c;

    public decimal Price { get; set; }

    public C C

    {

        set

        {

            if (_c != null)

                _c.Orders.Remove(this);

            _c = value;

            if (value != null)

            {

                CId = value.Id;

                value.Orders.Add(this);

            }

        }

    }

    public Guid CId { get; private set; }

}

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié lundi 17 mars 2008 07:05 par Matthieu MEZIL

Classé sous : , , ,

Commentaires

# re: LINQ : encore un quizz @ lundi 17 mars 2008 14:01

42?

Miiitch

# re: LINQ : encore un quizz @ lundi 17 mars 2008 16:32

Salut Michel,

42 ?!? je suis curieux de savoir d'où tu sors ce 42.

Matthieu MEZIL

# re: LINQ : encore un quizz @ mardi 18 mars 2008 12:07

Du guide du routard intergalactique bien sur :)

RaptorXP

# re: LINQ : encore un quizz @ mardi 18 mars 2008 17:37

Miitch, Matthieu, à l'occasion je vous invite à prendre un verre.

je crois que c'est le bon moment :p

Parceque si vous faite ca de tete, je suis tres inquiet pour votre santé mental :)

FredD

# re: LINQ : encore un quizz @ mardi 18 mars 2008 22:45

La réponse "naturelle" (sauf pour Mitch et Fred :p) est

2

2.

Cependant ce n'est pas la bonne.

La bonne réponse est

0

0

Pourquoi ?

Quand on a un IEnumerable tel qu'on l'a avec la requête LINQ, l'exécution ne se passe que lors de l'énumération de celui-ci. Donc dans le cas présent, l'exécution va se passer avec

var customers = (from c in q

                select c.Customer).ToList();

Cependant lorsqu'on fait ensuite

var orders = (from co in q

             from o in co.Orders

             select o).ToList();

on va réexécuter le requête LINQ. De ce fait, on va instancier de nouveaux C. Par conséquent, le set de O.C va impacter les nouveaux C mais pas ceux de customers. D'où les 0.

Matthieu MEZIL

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30