c# – IEnumerable中的项目不等于List中的项目

我只是无法弄清楚为什么没有找到我的过滤列表中的项目。我已经简化了示例来显示它。我有一个课程项目

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()

那么,它可以找到它。如果我撤消该行并且稍后在Filter-method中调用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表达式的时候和什么地方有什么不同,为什么没有找到该项目?我不明白

原因是延期执行。

你初始化_items字段

itemNames.Select(x => new Item(x));

这是一个查询,而不是该查询的答案。每次迭代_items时执行此查询。

所以在你的Filter方法的这一行:

var ret = new List<Item>(_items.Where(x => x.Name.Contains(word)));

枚举源数组,为每个字符串创建一个新的Item(x)。这些项目存储在您的列表中。

当您调用Contains(_items.First())之后,First()再次执行_items中的查询,为每个源字符串创建新的Item实例。

由于Item的Equals方法可能不会被覆盖,并且执行简单的引用等式检查,所以从第二次迭代返回的第一个Item与您的列表中的Item不同。

翻译自:https://stackoverflow.com/questions/41266178/an-item-in-ienumerable-does-not-equal-an-item-in-list

转载注明原文:c# – IEnumerable中的项目不等于List中的项目