对IEnumerable中第一个项目的变量赋值不起作用

时间:2017-12-19 21:21:32

标签: c# linq ienumerable

我正在尝试将值true分配给我的对象集合中的字段。我使用First()方法检索第一个对象,并分配给它。在此示例中,我将值true分配给Show变量。但是,在分配后,Show变量似乎仍为false

    public class CallerItem
    {
        public int IndexId;
        public string PhoneNumber;
        public bool ToInd;
        public bool Show;
    }

    public void myFunc() {
        var callers = dbCallerRecs.Select(x => new CallerItem() { IndexId = x.IndexId, PhoneNumber = x.PhoneNumber, ToInd = x.ToInd });
        var toCallers = callers.Where(x => x.ToInd);
        if (toCallers.Any())
        {
            toCallers.First().Show = true;
            Console.Log(toCallers.First().Show); //THIS LOGS 'false'. HOWEVER, IT SHOULD LOG 'true'
        }
    }

我有什么遗失的吗?也许我对Where条款返回的引用的理解不对吗?

2 个答案:

答案 0 :(得分:1)

var callers = dbCallerRecs.Select(x => new CallerItem() { IndexId = x.IndexId, PhoneNumber = x.PhoneNumber, ToInd = x.ToInd });
var toCallers = callers.Where(x => x.ToInd);

定义了一个查询,当查询生成的IEnumerable<CallerItem>(或实现IQueryable<CallerItem>的{​​{1}})中的某些元素时,会对其进行求值。这种情况在您的代码中发生三次 - 调用IEnumerable<CallerItem>时,您都会调用Any(假设First返回.Any())。

您看到此行为的原因是对true的两次调用导致重新评估查询并为每个调用创建一个新对象,因此您要修改另一个对象你最终记录了。

一种解决方案是热切地评估查询:

First

答案 1 :(得分:1)

JsonProperty

每次致电if (toCallers.Any()) { toCallers.First().Show = true; Console.Log(toCallers.First().Show); //THIS LOGS 'false'. HOWEVER, IT SHOULD LOG 'true' } 时,您都是getting the first item。对于某些枚举(例如.First()),它每次都会返回不同的对象。

以下代码只会将方法调用,从而避免此问题。 另请注意,我使用了IQueryable而不是FirstOrDefault 然后 Any - 因为前者会导致更少的数据库查询(即更快)。

First