2010-07-28 29 views
2

有一個LINQ結果,需要用純文本格式很好地通過電子郵件發送。如何在C#中將一些類的列表格式化爲一個漂亮的ASCII表?

例如,每條記錄包含「ProductName」,「SalesAmount」,「Taxes」 產品名稱可以是不同記錄的字符串長度不同。

需要將這樣的記錄列表格式化爲純文本表格。使用「----------」作爲水平線和「|」作爲垂直線。

由於您不知道產品名稱的最大尺寸,因此您不知道垂直線的大小。假設需要查找最大產品名稱長度,並根據它計算所需「 - 」字符的數量。但是有什麼可以自動格式?

假設字體是單間隔的。

這樣做的最佳方法是什麼?

謝謝。

+1

需要更多的信息。你的對象包含什麼樣的東西,你想如何格式化等等...... – ZombieSheep 2010-07-28 07:47:09

+0

如果有答案,確定它會被接受;)如果答案是「這是不可能的」,不要認爲這是一個好主意接受它。 – Zelid 2010-07-28 08:18:15

回答

3

您可能要查找的是格式字符串中的對齊參數。 I .: .:

string s = String.Format("{0,-20}{1,-20}{2,-20})", "one", "two", "three"); 

將呈現三個相等的列,每個20個字符左對齊(當您刪除減號時爲右對齊)。使用它可以在純文本中創建漂亮的列,並僅使用您的數據。

您的編輯後:

// loop through your data and find the largest common size (note: you can use LINQ) 
int maxCol1 = 0; 
int maxCol2 = 0; 
foreach(item in yourData) 
{ 
    maxCol1 = item.Col1 > maxCol1 ? item.Col1 : maxCol1; 
    maxCol2 = item.Col2 > maxCol2 ? item.Col2 : maxCol2; 
} 

// create formatting strings, add all sizes: 
string line = new String('-', 2 + maxCol1 + maxCol2 + nr of columns ...); 
string formatString = String.Format(
     "|{{0,-{0}}}|{{1,-{1}}}|{{2,-{2}}}|)", 
     maxCol1,maxCol2 ...); 

// create your text-only mail neatly formatted 
yourStringWriter.WriteLine(line); 
foreach(item in yourData) 
{ 
    yourStringWriter.WriteLine(String.Format(formatString, item.Col1, item.Col2); 
    yourStringWriter.WriteLine(line); 
} 

以上將輸出以下(與你的屬性取代了臭名昭著的Col1中,col2的,如姓名,地址等):

 
---------------------- 
|one |two |three | 
|four |five |six | 
|seven |eight |nine | 
---------------------- 
+0

啊,聰明。我不知道這是'string.Format'可能的。 – Noldorin 2010-07-28 07:59:36

+0

@Noldorin:在我編輯之後,你可以看到我是如何反轉的,首先格式化格式字符串(注意雙''{''和'}}');-) – Abel 2010-07-28 08:09:21

+0

謝謝,好主意,會嘗試。 – Zelid 2010-07-28 08:13:08

0

在純文本郵件中沒有一種可靠的方式來實現這一點(如果你正在尋找一個漂亮的方桌),因爲你不能假設電子郵件客戶端使用標籤的方式,你可以因爲你不知道人們將使用什麼樣的字體,所以不要使用空格。

+0

電子郵件的默認字體,即使具有臭名昭着的外觀,固定寬度爲純文本,可以很容易地列。我還沒有看到客戶在那裏違約。或者,您可以創建HTML電子郵件並具有所需的所有格式。 – Abel 2010-07-28 07:58:40

+0

我懷疑我們只是在辯論術語「可靠」的含義......--) – 2010-07-28 08:40:07

相關問題