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,那是否意味着我正在使用副本?我做错了什么?
答案 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进行评估。