【问题标题】:Select multiple where on same column在同一列上选择多个位置
【发布时间】:2013-02-03 23:20:49
【问题描述】:

给定以下代码:

var filtered = (from a in lijst select a);

 foreach (string brandstof in checkedListBoxHoofdbrandstof.CheckedItems)
 {
   MessageBox.Show(brandstof);
   filtered =  (from a in lijst where a.Hoofdbrandstof.Contains(brandstof) select a);
 }
 MessageBox.Show(filtered.Count().ToString());
  • lijst 是一个类的 List ,大约有 16000 个项目

checkedListBoxHoofdbrandstof.CheckedItems 包含多个项目时,查询仅使用最后一个 where 子句的结果。

例如:我有 2 个值,A 和 B,尽管 A 返回 100 行,B 返回 50 行,但结果只包括最后 50 行。 A 不再包含在结果中。

我尝试使用a.Hoofdbrandstof.Any,但这会导致类型错误。我也试过a.Hoofdbrandstof.Equals,结果一样。

有谁知道我可以如何组合这些结果,以便 A 和 B 的结果都在 var 过滤中?

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    简单的方法:

    var checkedItems = checkedListBoxHoofdbrandstof.CheckedItems;
    var filtered = from a in lijst
                   where checkedItems.Contains(a.Hoofdbrandstof)
                   select a
    

    但是如果O(n^2) 将其降低到O(n) 使用Join 操作,这种方法的复杂性

    var checkedItems = checkedListBoxHoofdbrandstof.CheckedItems.Cast<string>().ToList();
    var filtered = from a in lijst
                   join checkedItem in checkedItems on a.Hoofdbrandstof equals checkedItem
                   select a
    

    【讨论】:

    • 第一个结果如下,尽管 .Intersect 是弹出窗口中的一个选项。错误 CS1928:“字符串”不包含“相交”的定义和最佳扩展方法重载“System.Linq.Enumerable.Intersect(System.Collections.Generic.IEnumerable, System.Collections.Generic。 IEnumerable)' 有一些无效参数
    • @JannickBolten Hoofdbrandstof 的类型是什么? 字符串?
    • 它是:public String Hoofdbrandstof { get;放; }
    • 你的第一个解决方案让我大吃一惊;我以前怎么没想到?!第二个导致错误:连接子句中的表达式之一的类型不正确。调用“加入”时类型推断失败。
    • @JannickBolten checkedItems 是什么类型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2014-12-24
    • 2011-05-02
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多