【发布时间】:2016-12-21 15:20:58
【问题描述】:
我只是想不通为什么在我的过滤列表中找不到该项目。我已经简化了这个例子来展示它。我有一个类 Item...
public class Item
{
public Item(string name)
{
Name = name;
}
public string Name
{
get; set;
}
public override string ToString()
{
return Name;
}
}
...还有一个“Items”类,它应该过滤项目并检查第一个项目是否仍在列表中...
public class Items
{
private IEnumerable<Item> _items;
public Items(IEnumerable<Item> items)
{
_items = items;
}
public List<Item> Filter(string word)
{
var ret = new List<Item>(_items.Where(x => x.Name.Contains(word)));
Console.WriteLine("found: " + ret.Contains(_items.First()));
// found: false
return ret;
}
}
执行代码如下:
static void Main(string[] args)
{
string[] itemNames = new string[] { "a", "b", "c" };
Items list = new Items(itemNames.Select(x => new Item(x)));
list.Filter("a");
Console.ReadLine();
}
现在,如果我执行程序,Console.WriteLine 会输出找不到该项目。但为什么呢?
如果我将构造函数中的第一行更改为
_items = items.ToList()
然后,它可以找到它。如果我撤消该行并稍后在 Filter 方法中调用 ToList(),它也找不到该项目?!
public class Items
{
private IEnumerable<Item> _items;
public Items(IEnumerable<Item> items)
{
_items = items;
}
public List<Item> FilteredItems
{
get; set;
}
public List<Item> Filter(string word)
{
var ret = new List<Item>(_items.Where(x => x.Name.Contains(word)));
_items = _items.ToList();
Console.WriteLine("found: " + ret.Contains(_items.First()));
// found: false
return ret;
}
}
为什么执行 lambda 表达式的位置和时间会有所不同,为什么找不到该项目?没看懂!
【问题讨论】:
-
每次调用
x => new Item(x)));时,您都在初始化一个新项目。使用Select -
谢谢大家。这很明显,但我没有看到。我今天应该辞职:D
标签: c# linq list lambda ienumerable