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

标签 c# 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!"

好!

但是,如果我向 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)”语句,可以通过两种方式重现该问题。

有什么线索吗?

最佳答案

我无法重现,这是测试总是通过。

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

或者我们是否遗漏了一些不同于您的东西?

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

关于c# - linq 查询后未调用 ToString() 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34398256/

相关文章:

c# - 如何查看 asp.net api 中 ajax 调用请求的数据类型

c# - 为什么 BinaryWriter 会在流的开头添加乱码?你如何避免它?

c# - 验证 Word 2007 模板文件

java - arrays.toString() 自定义格式

jquery - 使用 jQuery 将 xml 转换为字符串

java - 为什么第一行抛出 NullPointerException 但第二行没有?

c# - WPF 中 TreeView 中的 DataGrid

c# - 在 C# 的对象列表中打印出 1 个对象

java - 从类名生成的 toString() 文本

java - 如何重写 toString 方法来显示我的堆栈?