2012-09-04 15 views
1

我有以下結構:如何讓ToString()方法用於海關結構列表

struct entry 
{ 
    public string msg; 
    public UInt32 ts; 
    public bool newLines; 

    public entry(string message, UInt32 timestamp, bool lines = false) 
    { 
     msg = message; 
     ts = timestamp; 
     newLines = false; 
    } 

    public override string ToString() 
    { 
     return msg + (newLines ? "\n" : ""); 
    } 
}; 

我使用我的程序,這些結構的列表,在程序的某些部分,我需要取這些條目的列表,並將它們組合成一個由換行符分隔的長字符串。我的問題是我的ToString()方法將與List<entry>一起使用?或者我需要重寫另一個函數?

感謝

+0

你試過了嗎? –

+0

你的問題沒有意義。如果你要爲'ToString()'提供一個'override'方法,那麼你可以使它的功能無論如何都是你想要的。所以至於你的最終問題**我的問題是我的ToString()方法將與列表?**當然一起工作,當然它可以使你的任何工作。 –

+0

如果您的條目列表將會很長,那麼您應該提供一種將條目列表轉換爲所需字符串的新方法。如果您創建ToString重載,則在某些情況下,如果您不需要很長的字符串(例如,在調試器中),可能會調用它。這也可以讓你不必爲了覆蓋ToString而創建一個新的類型。如果你是新手,有時間玩,那麼我建議你試試兩種方法,這樣你就可以瞭解最適合你的方式,以及爲什麼。 – phoog

回答

5

您將需要作出繼承名單像這樣的自定義類:

public class EntryList : List<entry> 
{ 
    public override string ToString() 
    { 
     //return what you want 
     //EDIT: accessing items 
     foreach (entry e in this) 
     //... 
    } 
} 
+0

也可以創建一個新的函數。所有你需要的是對'List '的引用,在這種情況下這不是問題。 –

+0

我還是C#的新手,我認爲'EntryList:List '擴展名爲的類對嗎?我如何訪問列表的數據?我是否需要聲明一些變量和構造函數? – MasterGberry

+0

@MasterGberry你可以像使用'List '一樣使用EntryList(感謝Liskov替換原理)。例如:'List theList = new EntryList();' – phoog

2

構建自己的 'EntryList',從列表<進入派生>並重寫的ToString()。

另一個提示 - 在你的ToString實現中使用StringBuilder來更有效地構建你的超級字符串。

3

它是不會爲List<entry>工作,因爲你要重寫條目結構的ToString。你可以簡單地使用string.Join

var fullString = string.Join(",", entries); 

您還可以創建新的類型,其將繼承形式List<entry>在其中您可以覆蓋ToString

0

而不是一個全新的子類,您可以使用具有該方法的擴展方法。然而,正如其他人所提到的那樣,將一個長列表保存爲一個字符串可能不是正確的,並且會產生奇怪的效果(特別是在調試器中)。

實現不分:

它可能更正確的有名單的toString反映 一些狀態列表(項目總數值的總和,等等),而不是傾銷每個項目的詳細信息。