C# 枚举内的Switch语句。如何提高绩效?

C# 枚举内的Switch语句。如何提高绩效?,c#,performance,linq,C#,Performance,Linq,我有一个要使用Linq OrderByDescending排序的项目列表。 排序作为值传递给switch语句 items.OrderByDescending((SomeObject)i => { switch(cond) { case "conditionA": return (float)i.MemberA; case "conditionB": return (long)i.MemberB; case "c

我有一个要使用Linq OrderByDescending排序的项目列表。 排序作为值传递给switch语句

items.OrderByDescending((SomeObject)i => {
   switch(cond)
   {
      case "conditionA":
        return (float)i.MemberA;
      case "conditionB":
        return (long)i.MemberB;
      case "conditionC":
        return (int)i.MemberB;
   }})
我关心的是这个循环的性能。
有没有办法预先定义返回值并将其传递到循环中一次?

您可以将开关移到降序
方法之外。只需将lambda定义为
Func
,并在linq查询之前分配它:

Func<SomeObject, float> orderBy = null;
switch (cond)
{
    case "conditionA":
        orderBy = i => (float)i.MemberA;
        break;
    case "conditionB":
        orderBy = i => (float)i.MemberB;
        break;
    default:
        orderBy = i => (int)i.MemberC;
        break;
}

如果
items
IQueriable
的,您可以将
Func
更改为
Expression
您可以将开关移到
OrderByDescending
方法之外。只需将lambda定义为
Func
,并在linq查询之前分配它:

Func<SomeObject, float> orderBy = null;
switch (cond)
{
    case "conditionA":
        orderBy = i => (float)i.MemberA;
        break;
    case "conditionB":
        orderBy = i => (float)i.MemberB;
        break;
    default:
        orderBy = i => (int)i.MemberC;
        break;
}

如果
items
IQueriable
您可以将
Func
更改为
Expression

您可以使用默认条件:如果没有匹配项,将使用该条件。可以预定义默认值。这看起来像是X/Y问题。为什么您的
成员属性尚未正确键入?您实际上无法使用
float
s对
int
s进行排序;不管怎么说,你最终还是会选择其中一个。因此,您可以将所有内容作为
浮点值进行比较。您可以使用默认值:如果没有匹配项,则将使用该条件。可以预定义默认值。这看起来像是X/Y问题。为什么您的
成员属性尚未正确键入?您实际上无法使用
float
s对
int
s进行排序;不管怎么说,你最终还是会选择其中一个。因此,您可以将所有内容作为
浮点值进行比较。这正是我所需要的。感谢我所需要的。谢谢