【问题标题】:Querying a list of strings with a query string?用查询字符串查询字符串列表?
【发布时间】:2014-09-05 15:18:55
【问题描述】:

我有一本字典:

<string,List<string>>

关键是产品代码说“product1”然后列表是属性列表:

"Brand","10.40","64","red","S"

然后我'可以'有一个规则/过滤器列表,例如

var tmpFilter = new customfilters();
tmpFilter.Field = "2";
tmpFilter.Expression = ">";
tmpFilter.Filter = "10";

因此对于上面的示例,这将通过,因为在索引 2 (tmpFilter.Field) 处它大于 10;然后我有另一个对象,它定义了我要写入文件的列表中的哪些字段。对于那个字典项目,我只想写过滤器匹配的产品品牌和价格。

目前我没有过滤器:

var tmp = new custom();
tmp.Columns = "0,1";
tmp.Delimiter = ",";
tmp.Extention = ".csv";
tmp.CustomFilters = new List<customfilters>() {new customfilters(){ Field = "2", Expression = ">", Filter = "10"} };

public static void Custom(custom custom)
{
  foreach (var x in Settings.Prods)
  {
    //Get Current Product Code
    var curprod = Settings.ProductInformation[x];// the dictionary value

    foreach (var column in custom.Columns)
    {
      var curVal = curprod[Convert.ToInt32(column)];
      tsw.Write(curVal + custom.Delimiter);
    }
    Settings.Lines++;
    tsw.WriteLine();
  }
  tsw.Close();
}

如果所有过滤器都通过该字符串列表,我只想编写 curprod。

我该怎么做?

【问题讨论】:

  • 您是否已经让customFilter 逻辑正常工作?您实际上是如何将它们应用到您的属性列表中的?
  • 我目前没有应用过滤器逻辑,这是一个问题,当我选择要写入文件的“产品”时如何应用过滤器逻辑 customfilters 对象只是定义了过滤器,它是一个字段自定义对象查看我的更新
  • 仍然不完全清楚你卡在哪一部分。您是否在问如何仅选择通过过滤器的项目(在这种情况下,您可以简单地说if (applyMyFilters(curprod)),其中applyMyFilters 是将每个过滤器应用于您传递的List&lt;string&gt; 的函数并返回true 或false)或者您是在问如何实际使用自定义过滤器本身?换句话说,在您的示例中,如何使 tmpFilter 使用条件 &gt;10 实际测试列表中的第三项?
  • 我怎样才能真正应用字符串中的测试,这样我就可以做类似 curprod[0].SomeMethordToQuery("> 10") 的事情,它返回一个布尔值
  • 好的 - 所以您真正要寻找的是如何将 &gt; 10 解析为实际的逻辑谓词。

标签: c# string list dictionary


【解决方案1】:

有一个非常棒的 Nuget 包,基于 Microsoft 发布的一个示例,由于某种原因,他们决定很难找到它,它允许动态 linq 查询:

https://www.nuget.org/packages/System.Linq.Dynamic/1.0.2

来源:

https://github.com/kahanu/System.Linq.Dynamic

使用它你可以很容易地做这样的事情(注意:我在这里使用字符串是因为 OP 声明他们有一个List&lt;string&gt;):

List<string> stuff = new List<string> { "10.40", "64", "5", "56", "99", "2" };

var selected = stuff.Select(s => new { d = double.Parse(s) }).Where("d > 10");

Console.WriteLine(string.Join(", ", selected.Select(s => s.d.ToString()).ToArray()));

输出:

10.4, 64, 56, 99

这可能会给你一个开始的地方。您必须解决的一件事是确定哪些字段是数字的,并且在尝试应用过滤器之前应该将其转换为数字类型。否则,您将作为字符串进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多