1 votes

Méthode where de l'extension C# - gestion d'un cas où l'élément n'est pas trouvé

J'essaie d'interroger ce document XML très compliqué à l'aide de xDocument et de LINQ to XML . Je veux effectuer l'action suivante :

Récupère tous les éléments qui répondent à un certain critère, et s'ils ne le font pas, renvoie un autre attribut du xDocument.

Exemple :

<cars>
    <car>
        <patrol type="oil">
            <url> http://Toyotaoil.com </url>
        </patrol>
    </car>
    <car>
        <patrol type="oil">
            <url> http://BMWoil.com </url>
        </patrol>
        <patrol type="gas">
            <url> http://BMWgas.com </url>
        </patrol>
    </car>
    <car>
        <patrol type="gas">
            <url> http://Hondagas.com </url>
        </patrol>
    </car>

Maintenant, ce que j'aimerais obtenir de cette requête, c'est une liste de patrouilles de type huile, à moins que la voiture n'utilise pas d'essence, et dans ce cas, je me contenterais de l'essence.

Si j'utilise le where clause Je manque juste les cas où la voiture utilise du gaz. Existe-t-il une telle chose comme une where où je peux spécifier ce qu'il faut faire si la condition n'est pas remplie ?

2voto

dtb Points 104373
xdoc.Element("cars")
    .Elements("car")
    .Select(car => car.Elements("patrol")
                      .SingleOrDefault(p => (string)p.Attribute("type") == "oil")
                   ??
                   car.Elements("patrol")
                      .Single(p => (string)p.Attribute("type") == "gas"));

2voto

Zyphrax Points 6603

La solution ci-dessous devrait vous donner la possibilité d'interroger ce que vous voulez :

var result = from car in xdoc.Element("cars").Elements("car") 
             let patrols = car.Elements("patrol")
             let oils = patrols.Where(patrol => patrol.Attribute("type") == "oil")
             select new {
                    Car = car,
                    Patrols = (oils.Any() ? oils : patrols)
             }

Je n'ai pas Visual Studio ici, donc j'espère que ça compile :)
Donnez un peu plus d'informations sur ce que vous voulez sélectionner, et je vous donnerai une déclaration LINQ plus spécifique.

1voto

Lasse Espeholt Points 11944

Tu peux juste faire quelque chose comme ça :

var query = from element in someElements
            select element.Attribute("type").Value == "oil"
                ? returnSomethingWhenItIsOil
                : returnSomethingWhenItIsSomethingElse;

ou

var query = from element in someElements
            where element.Attribute("type") == "oil"
                || element.Attribute("type") == "gas"
            select element;

Mais explique mieux le problème, merci :)

0voto

Jon Skeet Points 692016

On dirait que vous ne voulez pas du tout de clause where - vous voulez juste une clause select qui choisit une valeur ou une autre.

Cependant, votre exemple ne décrit pas vraiment comment vous sélectionneriez un élément différent en fonction des valeurs - quel "autre attribut" sélectionneriez-vous ? Qu'entendez-vous par "où la voiture consomme de l'essence" ? Si vous pouvez donner plus de détails sur l'exemple, il ne devrait pas être trop difficile de vous donner le code correspondant.

0voto

Asad Butt Points 8989
                       var cars = from c in xdoc.Descendants("car")
                       where
                       (c.Element("patrol").Attribute("type").Value == "oil" ||
                       c.Element("patrol").Attribute("type").Value == "gas")
                       select new Car
                       {
                           FuelType = c.Element("patrol").Attribute("type").Value.ToString()
                       };

    foreach (Car c in cars)
        {
            Console.WriteLine(c.ToString());
        }

    class Car
    {
        public string FuelType { get; set; }
        public override string ToString()
        {
            return "Car FeulType = " + this.FuelType.ToString();
        }
    }

Voici les résultats que j'obtiens

alt text

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