Я просто не могу понять, почему элемент в моем отфильтрованном списке не найден. Я упростил пример, чтобы показать его. У меня есть класс...
public class Item
{
public Item(string name)
{
Name = name;
}
public string Name
{
get; set;
}
public override string ToString()
{
return Name;
}
}
... и класс "Элементы", которые должны фильтровать элементы и проверять, находится ли первый элемент в списке...
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()
то он может ее найти. Если я отменим эту строку и вызову ToList() позже в методе Filter, она также не сможет найти элемент?!
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;
}
}
Почему существует разница, когда и когда выполняется выражение лямбда и почему элемент не найден? Я не понимаю!