【问题标题】:Can not select many items from list using LINQ or lambda query无法使用 LINQ 或 lambda 查询从列表中选择许多项目
【发布时间】:2014-01-10 00:11:45
【问题描述】:

我有静态类中的对象列表。类似的东西:

public static class ClassOfItems
{
     private static List<Item> ListOfItems = new List<Item>();
     public static List<Item> GetAll()
     {
        return ListOfItems;
     }
}
public class Item
{
     public int id{get; set;}
     public string name{get;set:}
}

我从 XML 文件初始化项目。直到那一刻一切都好。例如,我的静态类中有两个项目:

item1:
   id=1
   name="item1"

item2:
   id=2
   name="item2"

现在我想选择 id 值大于 0 的项目(例如):
1 方式:

var items=from i in ClassOfItems.GetAll()
          where i.id>0
          select i;

2路:

var items=ClassOfItems.GetAll().Where(i => i.id>0);

他们都没有工作:(

我刚刚注意到,当我使用返回单个对象的方法时,它正在工作。例如:

var items=ClassOfItems.GetAll().First(i => i==1);//it's working
var items=ClassOfItems.GetAll().Where(i=> i==1);//not working ;(

哈哈解决了 对不起,伙计们:D 只需要使用 ToList() 方法即可。

var items=(ClassOfItems.GetAll().Where(i => i.id>0)).ToList();

【问题讨论】:

  • 请解释您所说的“不工作”是什么意思。是否抛出异常?当您期待两个结果时,您是否只看到一个结果?
  • 我期待超过 1 个结果,但我得到空值:oi40.tinypic.com/2hp6t08.jpg 我正在使用 Where 方法
  • @TomaszDev,你的 where 方法从一开始就有效。只是你没有用 foreach 尝试它,你认为它不起作用。
  • 是的。我失去了一个多小时才注意到......

标签: c# linq windows-phone-7 select lambda


【解决方案1】:

Select() 转换一个对象。因此,在您的最后一个 Select 语句中,您将返回 bool

如果您希望获得一个结果,您可以使用First(i=&gt; i.id==1)FirstOrDefault(i=&gt; i.id==1),如果您希望获得多个结果,请使用Where(i=&gt; i.id==1)

【讨论】:

  • var items=ClassOfItems.GetAll().Where(i=> i.id>0); //也不工作;(
  • 您期待一个结果吗?然后使用FirstOrDefault(i=&gt;i.id==1) 返回null 或一个结果。
  • 我期待多个结果。我正在使用 Where 但我得到了这个:oi40.tinypic.com/2hp6t08.jpg
  • 您是否验证过GetAll() 方法包含所有元素?
  • 您能否发布示例代码,说明特定对象如何绑定到集合并插入到集合中?
【解决方案2】:

如果您查看documentation,,您将看到SelectWhere 方法返回IEnumerable&lt;TResult&gt;,即使您的序列有一个元素,也没关系。

实际上,您的 Where 方法按预期工作。如果您在 Where 之后使用 foreach 循环遍历您的列表,您将看到我是正确的。使用 yield return 的可枚举扩展方法,这就是为什么您在调试器。相反,您会看到 WhereListIterator.您可以查看此 documentation 以了解有关 yield 关键字的更多详细信息。

您通过使用 foreach 语句或 LINQ 查询来使用迭代器方法。 foreach 循环的每次迭代都会调用迭代器方法。在迭代器方法中到达 yield return 语句时,返回表达式,并保留代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。

但是,如果你想得到一个列表,只需在 where 之后使用ToList 方法:

var items=ClassOfItems.GetAll().Where(i=> i==1).ToList();

【讨论】:

    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2021-12-30
    相关资源
    最近更新 更多