C# linq查询后未调用ToString()重载

C# linq查询后未调用ToString()重载,c#,tostring,C#,Tostring,更新:这个问题仍然存在于我的现实世界解决方案中——但不是在LinqPad中。我知道你不能复制它。我也不能。只要我有空闲时间,我就会把现实世界的解决方案剥离出来,与大家分享 考虑一下这个简单的类 public class Node { public string Group { get; set; } public int SequenceNumber { get; set; } public override string ToString() {

更新:这个问题仍然存在于我的现实世界解决方案中——但不是在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!"
2015-12-21 15:25:00.0137  DEBUG   Company.Project.Controls.MyControl   Node "Company.Project.Node"
_nodes[0].ToString();
"Company.Project.Node"
((QpVisualizerNode)_nodes[0]).ToString();
"Company.Project.Node"

但是,如果我向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:29:00.9083  DEBUG   Company.Project.Controls.MyControl   Node "This is the Node.ToString() method!"
2015-12-21 15:25:00.0137  DEBUG   Company.Project.Controls.MyControl   Node "Company.Project.Node"
_nodes[0].ToString();
"Company.Project.Node"
((QpVisualizerNode)_nodes[0]).ToString();
"Company.Project.Node"
糟糕

这与记录器无关。Visual Studio中间窗口:

2015-12-21 15:29:00.9083  DEBUG   Company.Project.Controls.MyControl   Node "This is the Node.ToString() method!"
2015-12-21 15:25:00.0137  DEBUG   Company.Project.Controls.MyControl   Node "Company.Project.Node"
_nodes[0].ToString();
"Company.Project.Node"
((QpVisualizerNode)_nodes[0]).ToString();
"Company.Project.Node"
.NET framework版本为4.5.51209(版本379893)

通过在linq查询中添加和删除“.OrderBy(n=>n.Group)”语句,可以通过两种方式再现该问题


有什么线索吗?

我无法复制,这是考试总是通过的

它是否也传入编译器?你能用你的工作站检查一下吗

还是我们在这里遗漏了什么,和你的不一样

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!");
    }
}

[TestMethod]
public void Test()
{
    var unsortedNodes = new List<Node>()
    {
        new Node { Group = "A", SequenceNumber = 1 },
        new Node { Group = "A", SequenceNumber = 2 },
        new Node { Group = "A", SequenceNumber = 3 },
        new Node { Group = "B", SequenceNumber = 11 },
        new Node { Group = "B", SequenceNumber = 12 },
        new Node { Group = "C", SequenceNumber = 20 },
    };

    var query = unsortedNodes.OrderBy(n => n.Group).GroupBy(n => n.Group).SelectMany(g => g.OrderBy(n => n.SequenceNumber));
    var _nodes = query.ToList();
    Assert.IsTrue(_nodes.ToList().All(n => n.ToString() == "This is the Node.ToString() method!"));
}
公共类节点
{
公共字符串组{get;set;}
公共int SequenceNumber{get;set;}
公共重写字符串ToString()
{
返回string.Format(“这是Node.ToString()方法!”);
}
}
[测试方法]
公开无效测试()
{
var unsortedNodes=新列表()
{
新节点{Group=“A”,SequenceNumber=1},
新节点{Group=“A”,SequenceNumber=2},
新节点{Group=“A”,SequenceNumber=3},
新节点{Group=“B”,SequenceNumber=11},
新节点{Group=“B”,SequenceNumber=12},
新节点{Group=“C”,SequenceNumber=20},
};
var query=unsortedNodes.OrderBy(n=>n.Group).GroupBy(n=>n.Group).SelectMany(g=>g.OrderBy(n=>n.SequenceNumber));
var_nodes=query.ToList();
Assert.IsTrue(_nodes.ToList().All(n=>n.ToString()==“这就是Node.ToString()方法!”);
}

我无法使用简单的console应用程序和console.Writeline复制此内容。您可以尝试执行生成->清理、重建并确认它仍然是一个问题吗?使用Console.WriteLine works精细地扩展日志以包括
n
类型,这可能是您所需的所有信息。例如:
\u nodes.ForEach(n=>LoggerProxy.Debug(\u logger,null,“类型为{1}的节点{0}”,n,n.GetType().Name))
I和其他人使用
Console.WriteLine时没有得到相同的行为。您能否用我们可以直接执行的完整示例(例如,使用Console.WriteLine)和您正在使用的.NET版本更新问题?您确定Company.Project是正确的命名空间吗?节点是一个非常常见的类名。也许您还有Company.Project.Controls.Node类?只是个傻瓜