更新:这个问题在我的实际解决方案中仍然存在,但在LinqPad中没有。我明白你无法重现它。我也不能。只要我有些空闲时间,我就会简化实际解决方案以便分享。
考虑这个简单的类
public class Node
{
public string Group { get; set; }
public int SequenceNumber { get; set; }
public override string ToString()
{
return string.Format("This is the Node.ToString() method!");
}
}
我有两个linq查询。它们都返回完全相同的结果,唯一的区别是后一个查询对之前排序过的列表进行了分组。
// working example
var query = unsortedNodes.GroupBy(n => n.Group).SelectMany(g => g.OrderBy(n => n.SequenceNumber));
_nodes = query.ToList();
_nodes.ForEach(n => LoggerProxy.Debug(_logger, null, "Node {0}", n));
示例结果:
2015-12-21 15:29:00.9083 DEBUG Company.Project.Controls.MyControl Node "This is the Node.ToString() method!"
很好!
然而,如果我在Linq查询中添加另一个“orderby”,因为我也想对分组进行排序,ToString()方法突然就不再起作用了。
// query working, but ToString() in logger method is not.
// sort by group, group by group, sort by sequence number
var query = unsortedNodes.OrderBy(n => n.Group).GroupBy(n => n.Group).SelectMany(g => g.OrderBy(n => n.SequenceNumber));
_nodes = query.ToList();
_nodes.ForEach(n => LoggerProxy.Debug(_logger, null, "Node {0}", n));
令我惊讶的是,现在日志只显示类名(默认ToString()行为)。
示例结果:
2015-12-21 15:25:00.0137 DEBUG Company.Project.Controls.MyControl Node "Company.Project.Node"
糟糕!
问题不在于记录器。而是在于Visual Studio中间窗口:
_nodes[0].ToString();
"Company.Project.Node"
((QpVisualizerNode)_nodes[0]).ToString();
"Company.Project.Node"
.NET框架版本为4.5.51209(发布版379893)
问题可以通过在linq查询中添加和删除“.OrderBy(n => n.Group)”语句两种方式复现。
有什么线索吗?
GroupBy
会给出一个IGrouping
的IEnumerable,而这个IGrouping
又是你类型的IEnumerable。 - Berin LoritschConsole.WriteLine
时没有得到相同的结果。你能否更新问题,提供一个可以直接执行的完整示例(例如使用Console.WriteLine
),并说明你正在使用的.NET版本? - steinar