3
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,这是否意味着我正在处理副本?我究竟做错了什么?

4

3 回答 3

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

于 2012-10-02T00:12:06.303 回答
1

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

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

让我们假设计数正在返回您当前的代码。对于您刚刚尝试的100条消息,它将返回一个不正确的计数。所以说_messages里面有101条消息。其中 100 个IsSent设置为 false,1 个IsSent设置为 true。IsSent在第一行中将 100设置为 true 后,_messages.Count(x => x.IsSent)将返回 101。根据您的count用途,101 可能没有意义。

于 2012-10-01T23:59:05.800 回答
0

您正在处理 Enumerable。Take 会产生一个结果,因此除非您.ToList()在最后添加 a ,否则您的.Count()调用基本上只会重新应用from m in _messages where m.IsSent == falseReturning the next 100 unsent messages 。

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

于 2012-10-02T00:11:10.337 回答