1
votes

Commande LINQ avancée dans les formulaires Xamarin

J'ai un ObservableCollection Items . Chaque élément dans Items a un nom de projet qui peut être «administratif» et «non administratif» (peut être n'importe quoi). Je souhaite trier mes éléments à l'aide de LINQ afin que les éléments avec un nom de projet non administratif soient placés au-dessus de l'élément administratif.

Jusqu'à présent, j'utilise,

Items.OrderBy(x => x.ProjectName != "Administrative").ThenBy(x => x.ProjectName == "Administrative");

Mais ça ne trie pas comme je veux et quand je débogue, j'ai vu

"L'expression n'est pas prise en charge".

Des idées?


3 commentaires

Que faites-vous avec le IEnumerable renvoyé par votre code?


Est-ce que cela répond à votre question? Pouvez-vous utiliser un Instruction CASE avec OrderBy dans une requête LINQ to Entities?


Le code que vous avez affiché ne contiendrait pas l'erreur «L'expression n'est pas prise en charge». Je pense que vous devez affiner votre question.


3 Réponses :


1
votes

Selon vos besoins, "Non-administratif" doit être placé au-dessus de "Administratif". Vous pouvez faire ceci:

var result = Items.OrderBy(p => p.ProjectName  == "Administrative").ThenBy(p => p.ProjectName);

il mettra "Non-Administrative" avant "Administrative".

Modifié

[pour le nom non administratif qui a 'AAA']:

var list = Items.OrderByDescending(x => x.ProjectName);


3 commentaires

Sauf s'il existe un projet nommé "Projet AAA" , qui sera placé sous "Administratif" . Veuillez noter que les projets non administratifs peuvent porter n’importe quel nom.


Si tel est le cas, il peut faire ceci: var result = Items.OrderBy (p => p.ProjectName == "Administrative"). ThenBy (p => p.ProjectName);


Cela est vrai s'ils veulent les classer par ordre alphabétique.



0
votes

Démo sur dotnet fiddle

Vous vous assurez que ProjectName == "Administrative" code> est toujours en bas.

var result = Items.OrderBy(p => p.ProjectName  == "Administrative");


2 commentaires

Le ThenByDescending est totalement inutile. S'il vous plaît voir ma réponse.


Salut @Damar, est-ce que cela répond à votre question? Faites-moi savoir si vous avez besoin d'aide. stackoverflow.com/help/someone-answers



1
votes

La façon dont vous utilisez OrderBy et ThenBy montre comment comprendre le fonctionnement de OrderBy . Veuillez consulter l'exemple suivant

Items.OrderBy(x => x.ProjectName == "Administrative")

Avec l'expression x.ProjectName! = "Administrative" , OrderBy examinera tous les éléments et les triera si ProjectName n'est pas "Administrative" .

| ID | Project Name   | ProjectName != "Administrative" |
---------------------------------------------------------
| 1  | Administrative | false                           | Items for false
| 3  | Administrative | false                           |
=========================================================
| 2  | X              | true                            | Items for true
| 4  | X              | true                            |

Cela donnera l'ordre suivant

| ID | Project Name   | ProjectName != "Administrative" |
---------------------------------------------------------
| 1  | Administrative | false                           |
| 3  | Administrative | false                           |
| 2  | X              | true                            |
| 4  | X              | true                            |

car true est considéré comme supérieur de OrderBy . ThenBy essaie maintenant d'ordonner les groupes en interne, c'est-à-dire que tous les articles qui correspondent à une seule "clé de commande" sont essayés d'être classés selon un autre critère. Voir le tableau suivant pour la visualisation

| ID | Project Name   | ProjectName != "Administrative" |
---------------------------------------------------------
| 1  | Administrative | false                           |
| 2  | X              | true                            |
| 3  | Administrative | false                           |
| 4  | X              | true                            |

Puisque ProjectName == "Administrative" a la même valeur pour tous les éléments avec un seul groupe , aucun ordre ultérieur ne se produit.

Comment pouvez-vous obtenir le résultat souhaité?

Utilisez simplement

| ID | Project Name   |
-----------------------
| 1  | Administrative |
| 2  | X              |
| 3  | Administrative |
| 4  | X              |

Depuis ProjectName == "Administrative" est true pour tous les projets administratifs et true est considéré comme supérieur par OrderBy ils apparaissent en dernier.


2 commentaires

Merci pour votre réponse, je veux quand même ajouter quelque chose. Donc, après avoir commandé avec succès la liste que je veux, je remarque que le type de la liste générée par la méthode OderBy devient "IOrdered .. (quelque chose):". Donc, toute personne qui utilise cette méthode OrderBy, n'oubliez pas de la rétablir dans le type souhaité. Dans mon cas ObservableCollection . Merci


@Damar certes, mais cela est vrai pour toutes les méthodes d'extension Enumerable .