【问题标题】:Using LINQ and lambdas to search Dictionary>Class>List>Struct data使用 LINQ 和 lambdas 搜索 Dictionary>Class>List>Struct 数据
【发布时间】:2017-09-30 17:37:01
【问题描述】:

给定以下数据源:

public struct Strc
{
    public decimal A;
    public decimal B;
    // more stuff
}

public class CLASS
{
    public List<Strc> listStrc = new  List<Strc>();
    // other stuff
}

Dictionary<string, CLASS> dict = new Dictionary<string, CLASS>();

我需要收集字典中的所有Strc.B,前提是Strc.A是例如> 3。

我得到了以下结果:

List<decimal> results = (
    from v in dizS.Values
    from ls in v.listStr
    where ls.A > 3
    select ls.B
    ).ToList();

我也尝试使用 lambdas 编写它,但我失败得很惨……

var res = dict.Values.Where(x => x.listStrc.Any(z => z.A > 3))

这是我所能得到的,但我没有设法选择 .B 数据...... 我做错了什么? (鉴于我一开始就做对了:D) 感谢您的宝贵时间。

【问题讨论】:

  • 您的查询表达式应该是您想要的。我不明白你的问题是什么?
  • 嗨,没有 lambdas 的工作正常,我无法让有 lambdas 的工作。

标签: c# linq lambda


【解决方案1】:

您实际上是在展平为一系列结构值 - 展平由 SelectMany 表示。所以你想要:

var res = dict.Values
    .SelectMany(x => x.listSrc)
    .Where(ls => ls.A > 3)
    .Select(ls => ls.B);

这基本上等同于您的查询表达式,但您尝试的方法调用建议尝试获得不同的结果,其中如果listSrcany 条目的 A 值大于3,您需要来自该listSrc所有 B 值。希望前者是您真正想要的,但值得仔细考虑。

【讨论】:

  • 只是好奇,这个答案和我的有区别吗?我的意思是,在我的回答中,我在SelectMany 内部过滤,你在外部过滤。因为那里的一切都是懒惰的,应该没有太大区别,但我对此表示怀疑。
  • @tym32167:不,我不希望有任何特别的区别。我发现我的更容易阅读和理解,但你的应该可以正常工作。
  • 嗯,我做了一些基准测试,我的代码似乎快了两倍...有趣的原因
  • @JonSkeet 我不是 100% 确定,但在我看来,您正在对集合进行两次迭代。一次用于 .SelectMany,然后再次过滤它。 tym32167 的解决方案是在 .SelectMany 中使用过滤选择器,因此应该能够通过对整个集合进行一次迭代来获得解决方案。如果我错了,请纠正我...
  • @DeveloperExceptionError:不,那不是真的。 LINQ 就是这样构建数据管道。所有这些都将被评估一次,懒惰地以流的方式。
【解决方案2】:

你可以试试这个

var result = dict.Values.SelectMany(x=&gt;x.listStrc.Where(l=&gt;l.A&gt;3)).Select(x=&gt;x.B);

【讨论】:

    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2014-01-01
    • 2012-09-06
    相关资源
    最近更新 更多