C# Xamarin形式的高级LINQ排序

C# Xamarin形式的高级LINQ排序,c#,linq,C#,Linq,我有一个可观察的收集项目。 项目中的每个项目都有一个项目名称,可以是“管理”和“非管理”(可以是任何内容)。我想使用LINQ对我的项目进行排序,以便将具有非管理项目名称的项目放在管理项目的顶部 到目前为止,我使用 Items.OrderBy(x => x.ProjectName != "Administrative").ThenBy(x => x.ProjectName == "Administrative"); 但是它没有按照我想要的方式排序,当我调试时,我看到 “该表达不受支持

我有一个
可观察的收集项目
。 项目中的每个项目都有一个项目名称,可以是“管理”和“非管理”(可以是任何内容)。我想使用LINQ对我的项目进行排序,以便将具有非管理项目名称的项目放在管理项目的顶部

到目前为止,我使用

Items.OrderBy(x => x.ProjectName != "Administrative").ThenBy(x => x.ProjectName == "Administrative");
但是它没有按照我想要的方式排序,当我调试时,我看到

“该表达不受支持”


有什么想法吗?

根据您的要求,“非行政性”应该放在“行政性”之上。 您可以这样做:

var list = Items.OrderByDescending(x => x.ProjectName);
它将把“非行政”放在“行政”之前

已编辑

[对于具有“AAA”的非管理名称]:

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

确保
ProjectName==“Administrative”
始终位于底部

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

如何使用
OrderBy
ThenBy
显示了对
OrderBy
工作原理的理解。请参见下面的示例

| ID | Project Name   |
-----------------------
| 1  | Administrative |
| 2  | X              |
| 3  | Administrative |
| 4  | X              |
使用表达式
x.ProjectName!=“管理”
OrderBy
将查看所有项目,并根据
ProjectName
是否为
“管理”
对其进行排序

这将产生以下顺序

| ID | Project Name   | ProjectName != "Administrative" |
---------------------------------------------------------
| 1  | Administrative | false                           |
| 3  | Administrative | false                           |
| 2  | X              | true                            |
| 4  | X              | true                            |
因为
true
OrderBy
认为更大
ThenBy
现在尝试在内部对组进行排序,也就是说,所有与单个“订单键”匹配的项目都尝试按照其他条件进行排序。有关可视化,请参见下表

| ID | Project Name   | ProjectName != "Administrative" |
---------------------------------------------------------
| 1  | Administrative | false                           | Items for false
| 3  | Administrative | false                           |
=========================================================
| 2  | X              | true                            | Items for true
| 4  | X              | true                            |
由于
ProjectName==“Administrative”
对单个组中的所有项目具有相同的值,因此不会进行后续排序

你怎样才能达到预期的结果? 简单使用

Items.OrderBy(x=>x.ProjectName==“管理”)

由于
ProjectName==“Administrative”
对于所有管理项目都是
true
,并且
true
OrderBy
认为更大,所以它们最后出现。

您如何处理代码返回的
IEnumerable
?这是否回答了您的问题?您显示的代码不会出现错误“表达式不受支持”。我认为你需要改进你的问题。除非有一个名为“AAA项目”的项目,它将放在
的“管理”
下面。请注意,非管理项目可能有任何名称。如果是这种情况,他可以这样做:var result=Items.OrderBy(p=>p.ProjectName==“administrative”)。然后是by(p=>p.ProjectName);如果他们想按字母顺序排列,这是正确的。然后按降序排列的
是完全无用的。请看我的答案。嗨@Damar,这能回答你的问题吗?如果你需要帮助,请告诉我。谢谢你的回答,我还是想补充一点。因此,在成功地对我想要的列表进行排序之后,我注意到由OderBy方法生成的列表的类型变为“IOrdered….(something):”。因此,任何使用此OrderBy方法的人都不要忘记将其更改回您想要的类型。在我的情况下,可观察到的收集。Thanks@Damar诚然,这适用于所有可枚举的扩展方法。
| ID | Project Name   | ProjectName != "Administrative" |
---------------------------------------------------------
| 1  | Administrative | false                           | Items for false
| 3  | Administrative | false                           |
=========================================================
| 2  | X              | true                            | Items for true
| 4  | X              | true                            |