Linq查询后未调用ToString()重载方法

3
更新:这个问题在我的实际解决方案中仍然存在,但在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)”语句两种方式复现。

有什么线索吗?


2
我无法使用简单的控制台应用程序和Console.Writeline来重现这个问题。您能否尝试进行Build -> Clean,重新构建并确认它仍然存在? - Chris Shain
5
使用 Console.WriteLine 可以正常工作。 - Valentin
1
我怀疑你正在引用由Linq语句添加的中间对象。例如,GroupBy会给出一个IGrouping的IEnumerable,而这个IGrouping又是你类型的IEnumerable。 - Berin Loritsch
3
我和其他人使用Console.WriteLine时没有得到相同的结果。你能否更新问题,提供一个可以直接执行的完整示例(例如使用Console.WriteLine),并说明你正在使用的.NET版本? - steinar
2
你确定 Company.Project 是正确的命名空间吗?Node 是一个非常常见的类名。也许你还有一个 Company.Project.Controls.Node 类?只是一个想法。 - Frode
显示剩余10条评论
1个回答

0

我无法复现,这个测试一直通过。

在你的编译器中也能通过吗?你能用你的工作站检查一下吗?

或者我们有什么遗漏的地方,与你的不同?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接