我有静态类中的对象列表。这样的事情:
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"
答案 0 :(得分:1)
Select()
转换对象。因此,在上一个Select语句中,您将返回bool
如果您希望获得一个结果,则可以使用First(i=> i.id==1)
或FirstOrDefault(i=> i.id==1)
;如果您期望获得多个结果,则可以使用Where(i=> i.id==1)
。
答案 1 :(得分:0)
如果查看documentation,,您会看到Select
和Where
方法返回IEnumerable<TResult>
,即使您的序列有一个元素,也无关紧要。
实际上你的Where方法按预期工作。如果你用foreach
循环遍历你的列表,你会看到我是正确的。使用yield return的无数扩展方法,这就是你看不到列表的原因在调试器中。相反,您会看到WhereListIterator.
您可以查看此documentation以获取有关yield关键字的更多详细信息。
使用foreach语句或LINQ查询来使用迭代器方法。 foreach循环的每次迭代都会调用迭代器方法。在迭代器方法中达到yield return语句时,将返回表达式,并保留代码中的当前位置。下次调用迭代器函数时,将从该位置重新开始执行。
但是,如果你想获得一个列表,只需在这样的地方使用ToList
方法:
var items=ClassOfItems.GetAll().Where(i=> i==1).ToList();