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

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01