Tôi không thể tìm ra lý do tại sao mục trong danh sách lọc của tôi không được tìm thấy. Tôi đã đơn giản hóa ví dụ để hiển thị nó. Tôi có một lớp Item ...Một mục trong IEnumerable không bằng một mục trong Danh sách
public class Item
{
public Item(string name)
{
Name = name;
}
public string Name
{
get; set;
}
public override string ToString()
{
return Name;
}
}
... và một lớp 'Mặt hàng' mà phải lọc các mục và kiểm tra xem mục đầu tiên vẫn có trong danh sách ...
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;
}
}
Mã thực thi trông giống như sau:
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();
}
Bây giờ, nếu tôi thực hiện chương trình, Console.WriteLine sẽ không tìm thấy mục đó. Nhưng tại sao?
Nếu tôi thay đổi dòng đầu tiên trong constructor để
_items = items.ToList()
sau đó, nó có thể tìm thấy nó. Nếu tôi hoàn tác dòng đó và gọi ToList() sau trong phương pháp Lọc, nó cũng không thể tìm thấy mục đó ?!
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;
}
}
Tại sao có sự khác biệt ở đâu và khi nào biểu thức lambda được thực hiện và tại sao không tìm thấy mục nào nữa? Tôi không hiểu!
bạn đang khởi tạo một mục mới mỗi khi bạn gọi'x => mục mới (x))); sử dụng 'Chọn' –
Xin cảm ơn các bạn. Nó rất rõ ràng, nhưng tôi không nhìn thấy nó. Tôi nên nghỉ làm hôm nay: D – melwynoo