2015-12-21 15 views
3

更新:問題仍然在我的現實世界的解決方案存在 - 不Lin​​qPad雖然。我明白你不能重現它。我也不行。只要我有空閒的時間,我會剝奪現實世界的解決方案,以便能夠分享它。的ToString()重載不會被調用

考慮這個簡單的類

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!" 

好!

但是,如果我添加另一個「orderby」的linq查詢,因爲我也希望分組排序,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框架版本是4.5.51209(釋放379893)

的問題是可再現通過添加和刪除的」 .OrderBy(N => n.Group兩種方式)「語句在linq查詢中。

任何線索?

+2

我無法使用簡單的控制檯應用程序和Console.Writeline重現此操作。你可以嘗試做一個生成 - >清理,重建並確認它仍然是一個問題? –

+0

請給我們更多的細節。你使用哪種記錄器,或者它是自定義的。 – dimonser

+5

爲Console.WriteLine工作正常 – Valentin

回答

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