【问题标题】:Filter Object List with string array list C# lambda expression使用字符串数组列表 C# lambda 表达式过滤对象列表
【发布时间】:2018-01-09 08:29:10
【问题描述】:

我曾尝试过类似的 SO 答案 here,但它不起作用,在我的情况下可能会遗漏一些东西。

背景:

我正在尝试从外部 API(大约 8k 条记录)中提取贸易工具列表,我只需要大约 10 条记录。所以试图过滤它如下,但过滤结果为 0 。

型号:

public class Trade
{
    public int ID { get; set; }
    public string Scrip { get; set; }
    public int Quantity { get; set; }            
}

过滤:

List<Trade> trades;
using (StreamReader sr = new StreamReader(Server.MapPath("~/Utils/trades.json")))
{
    trades = JsonConvert.DeserializeObject<List<Trade>>(sr.ReadToEnd());
}

List<Instrument> instruments = GetInstruments(Exchange: "NY");// count 8k
var result = instruments.Where(x => trades.Any(n => x.Name.Contains(n.Scrip))); //count 0

另外,尝试从交易列表中获取 Scrip 名称作为字符串数组并用于过滤,这也不起作用。

请提前告知并感谢。

【问题讨论】:

  • 调试器说什么?在trades.Any(n =&gt; x.Name.Contains(n.Scrip)) 的一次出现上确定它,证明它对于实际数据中的至少一个条目是正确的。它是基本的东西吗,比如大小写不匹配(字符串比较默认区分大小写)?
  • @dlatikay 调试器没有给我太多提示
  • 成功了!你是它的老板 :)
  • 您确定有一个instrument,其Name 包含trades 中的一项的Script 文本吗?
  • 你确定外壳也完全一样吗?也许您应该尝试使用标准的 foreach 循环而不是 linq,这样您就可以在循环内设置条件断点。代码看起来不错,但没有实际的示例数据,我们能做的就这么多了。

标签: c# list linq lambda


【解决方案1】:

感谢大家的帮助,这是一个愚蠢的错误

将 Contains 更改为 Equals 并按预期工作。

instruments.Where(x => trades.Any(n => x.Name.Equals(n.Scrip)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2018-06-07
    • 2019-01-31
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多