【问题标题】:Querying a list based on a string input根据字符串输入查询列表
【发布时间】:2020-02-20 05:48:39
【问题描述】:

我正在努力完成我认为应该是一项简单的任务,但发现它比我预期的要复杂得多。

基本上,给定:

public class MyObject
{
    public int A;
    public float B;
    public string C;
}

List<MyObject> objectList;

我希望能够读取字符串,例如:

"A < 1"
"B > 0.5"
"C = \"text\""

并为其中的每一个获取满足要求的 objectList 中的项目列表。

我一直在使用 LINQ 查询,例如:

objectList.Where(obj => obj.A < 1)

到目前为止,但我无法弄清楚如何使用字段名称创建类似的查询。

我是否缺少一些直截了当的东西?还是我的整个方法有缺陷?

【问题讨论】:

  • 试试objectList.Where(obj =&gt; obj.A &lt; 1 &amp;&amp; obj.B &gt; 0.5 &amp;&amp; obj.C == "text").ToList();?
  • 如果您的 objectList 包含 MyObject 类的列表,那么它应该会产生您期望的结果。 var results = objectList.Where(obj =&gt; obj.A &lt; 1 &amp;&amp; B &gt; 0.5 &amp;&amp; C.Equals("text"));。确保 objectList 已初始化并具有值。
  • 如果我对您要达到的目标有正确的认识,那根本不是直截了当的。您必须实现一个解释器,在运行时将文本映射到代码。您将其误认为是一个容易解决的问题,这可能源于对 C# 程序如何执行的有缺陷的概念(但不一定)。
  • @PaulKertscher 是的,我认为这是正确的。我想我在想这一切都是错误的。有没有其他更明智的方法来解决这个问题?
  • 您可能需要表达式来动态构建 linq 查询。一些帮助您入门的链接:From MSDNhttps://www.c-sharpcorner.com/UploadFile/vendettamit/create-dynamic-linq-using-expressions/

标签: c# linq


【解决方案1】:

我认为您可以使用表达式树,您可以创建自己的 lambda 表达式并传递 it Where 函数。

例如,请检查以下链接:

Dynamically generate LINQ queries

或者您可以使用 System.Linq.Dynamic 命名空间。:

https://docs.telerik.com/data-access/developers-guide/linq-support/data-access-feature-ref-linq-support-dynamic-linq

【讨论】:

    【解决方案2】:

    您可以应用 AND 运算符 (&amp;&amp;):

    objectList.Where(obj => obj.A < 1 && obj.B > 0.5 && obj.C == "text").ToList();
    

    阅读更多Filtering in LINQ

    编辑:

    如果要基于字符串查询可以使用System.Linq.Dynamic

    objectList.Where("string predicate ..");
    

    【讨论】:

    • 对不起,我可能不太清楚。我不想同时应用多个条件。我想根据条件字符串中的内容动态创建这些查询。因此,当字符串为“A obj.A 来测试字符串中指定的字段。
    • 现在这对我来说很有意义,您可以使用System.Linq.Dynamic。我已经更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多