【问题标题】:Switch statement inside enumeration. How to improve performance?枚举中的 switch 语句。如何提高性能?
【发布时间】:2018-12-12 01:19:27
【问题描述】:

我有一个我想使用 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;
   }})

我担心的是这个循环的性能。 有没有办法预先定义返回值并将其传递给循环一次?

【问题讨论】:

  • 您可以使用 default: 条件,如果没有匹配项则使用该条件。可以预定义默认值。
  • 这看起来像是 X/Y 问题。为什么您的 Member_ 属性尚未正确输入?
  • 你实际上不能用floats 对ints 进行排序;无论如何,您最终都会选择其中一个。所以你不妨把所有东西都比作float

标签: c# performance linq


【解决方案1】:

您可以将开关移到OrderByDescending 方法之外。只需将 lambda 定义为 Func<SomeObject, float> 并在 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;
}

现在您可以在排序中使用该 lambda

var res = items.OrderByDescending(orderBy);

如果itemsIQueryable,您可以将Func&lt;...&gt; 更改为Expression&lt;Func&lt;...&gt;&gt;

【讨论】:

  • 正是我需要的。谢谢
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
相关资源
最近更新 更多