Po prostu nie mogę zrozumieć, dlaczego pozycja na mojej przefiltrowanej liście nie została znaleziona. Uprośniłem przykład, aby to pokazać. Mam klasy Item ...Element w IEnumerable nie jest równy pozycji na liście
public class Item
{
public Item(string name)
{
Name = name;
}
public string Name
{
get; set;
}
public override string ToString()
{
return Name;
}
}
... i klasę „pozycje”, które powinny filtrować elementy i sprawdzić, czy pierwsza pozycja jest wciąż na liście ...
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;
}
}
Kod wykonujący wygląda następująco:
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();
}
teraz, jeśli uruchomić program, wyjścia Console.WriteLine że element nie zostanie znaleziony. Ale dlaczego?
Jeśli zmienię pierwszy wiersz konstruktora do
_items = items.ToList()
następnie może go znaleźć. Czy po cofnięciu tej linii i wywołaniu ToList() później w metodzie filtrowania również nie można znaleźć elementu ?!
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;
}
}
Dlaczego występuje różnica w miejscu i czasie, w którym wykonywane jest wyrażenie lambda i dlaczego nie znaleziono już elementu? Nie rozumiem tego!
Inicjujesz nowy element za każdym razem, gdy wywołasz 'x => new Item (x)); '. używając 'Wybierz' –
Dzięki chłopaki. To takie oczywiste, ale nie widziałem tego. Powinienem rzucić pracę na dzisiaj: D – melwynoo