允许对 IEnumerable<MyObj> 进行临时表达式

Posted

技术标签:

【中文标题】允许对 IEnumerable<MyObj> 进行临时表达式【英文标题】:Allowing ad-hoc expressions over IEnumerable<MyObj> 【发布时间】:2013-10-10 17:19:44 【问题描述】:

我有以下型号

public class Model
 
  public string Name get;set;
  public DateTime HireDate get;set;
  public decimal Salary get;set;
  public int Hours get;set;
 

现在我有以下列表

List<Model> employees = new List<Model>();

我正在从用户那里获取表达式字符串输入,以下是用户可能使用的示例

工资

工资 + 500

薪水*小时

总和(小时)

总和(小时 * 工资)

总和(小时)/分钟(小时)

我必须将用户的表达式处理成另一个 int 或 decimal 的 IEnumerable,具体取决于计算以及哪种类型具有更高的精度,例如第三个表达式将生成以下内容

var result = employees.Select(e => e.Salary * e.Hours)

第 4 个会变成这个

var result = employees.Sum(e => e.Hours)

我目前正在这样做,首先将表达式解析为解析树并使用System.Linq.Expressions 命名空间构建表达式树。使用这种方法,有很多代码,其他开发人员不容易阅读。有没有更简单的方法?

【问题讨论】:

【参考方案1】:

也许你可以在(已经很老的)Scott Gu's Blog 上找到一些帮助,而不是再做一次

或者至少它应该给你一个很好的代码库来看看

【讨论】:

这家伙在使用运行时编译吗?每次编译表达式时都会在内存中创建一个 dll。而且我的表达方式比 LINQ 简单得多。不过感谢分享。 @fahadash 他正在使用System.Linq.Expressions 的东西,解析一切等等,因为这有一些开销,你写的实际上是一样的

以上是关于允许对 IEnumerable<MyObj> 进行临时表达式的主要内容,如果未能解决你的问题,请参考以下文章

IEnumerable<T>是啥意思?

Javascript对象 - 以数字开头的键,允许吗?

逐步创建查询,我应该使用 IEnumerable 还是 IQueryable? [复制]

如何对 IEnumerable<string> 进行排序

对参数使用 IReadOnlyCollection<T> 而不是 IEnumerable<T> 以避免可能的多次枚举

无法将带有 [] 的索引应用于“System.Collections.Generic.IEnumerable<> 类型的表达式