无法使用LINQ或lambda查询从列表中选择多个项目

时间:2014-01-10 00:11:46

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

我有静态类中的对象列表。这样的事情:

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"

Now I want to select items where id value is more then 0 (for example):
1 way:

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

2 way:

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

Both of them not working :(

I just noticed that when I use methods with returns single objects it's working. For example:

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

haha solved sorry guys :D just needed to use ToList() method.

item1:
   id=1
   name="item1"

item2:
   id=2
   name="item2"

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

如果查看documentation,,您会看到SelectWhere方法返回IEnumerable<TResult>,即使您的序列有一个元素,也无关紧要。

实际上你的Where方法按预期工作。如果你用foreach循环遍历你的列表,你会看到我是正确的。使用yield return的无数扩展方法,这就是你看不到列表的原因在调试器中。相反,您会看到WhereListIterator.您可以查看此documentation以获取有关yield关键字的更多详细信息。

  

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

但是,如果你想获得一个列表,只需在这样的地方使用ToList方法:

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