在linq查询后不调用ToString()重载

时间:2015-12-21 14:42:05

标签: 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"

BAD!

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

_nodes[0].ToString();
"Company.Project.Node"
((QpVisualizerNode)_nodes[0]).ToString();
"Company.Project.Node"

.NET framework版本为4.5.51209(版本379893)

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

有任何线索吗?

1 个答案:

答案 0 :(得分:0)

我无法复制,这是测试总是通过。

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

或者我们在这里遗漏了一些与你不同的东西?

    <activity android:name=".LoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".SplashScreenActivity">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity
        android:name=".DashboardActivity">
        <intent-filter>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>