Linq返回对象的副本

时间:2012-10-01 23:48:19

标签: c# linq

var top100 = (from m in _messages
              where m.IsSent == false
              select m).Take(100);

foreach (var message in top100)
{
    message.IsSent = _sms.SendSMS(message.Source, message.Destination, message.TextMessage);
}

var count = _messages.Count(x => x.IsSent);

我无法理解为什么变量count等于0.我原本以为我正在使用对我的消息对象的引用,但如果count为0,那是否意味着我正在使用副本?我做错了什么?

3 个答案:

答案 0 :(得分:3)

我只是试着调查你的问题而我没有重现它所以它让我想知道你的IsSent是否真的是假的,这就是你得到结果的原因。

void Main()
{
    var top100 = (from m in Messages where m.IsSent == false select m).Take(100);   
    foreach (var message in top100) { 
        message.IsSent = true; 
    }
    var count = Messages.Count(x => x.IsSent); 
    Console.WriteLine(count);
}
List<Message> Messages {
    get {
        if(_messagesList == null) {
            _messagesList = new List<Message>();
            for (int i = 0; i < 100; i++)
                _messagesList.Add(new Message { IsSent = false });
        }
        return _messagesList;
    }
}
List<Message> _messagesList;
class Message {
    public bool IsSent { get; set; }
}

输出为100

答案 1 :(得分:1)

在短信处理后,只需从top100获取计数。

var count = top100.Count(m => m.IsSent);

让我们假装你的当前代码正在返回一个计数。它会返回一个对您刚刚尝试过的 100 消息不正确的计数。所以说_messages中有101封邮件。其中100个将IsSent设置为false,其中一个将IsSent设置为true。在您的第一行中设置的IsSent为真后,_messages.Count(x => x.IsSent)将返回101.根据您使用count的内容,101可能没有意义。

答案 2 :(得分:0)

你正在处理Enumerable。取得收益结果,因此,除非您在结尾处添加.ToList(),否则您的.Count()来电基本上只会重新应用from m in _messages where m.IsSent == false返回下一条100条未发送的消息。

.ToList()添加到初始值100,然后.Count()将根据您处理的初始值100进行评估。