2017-02-18 66 views
0

我有一個嵌套的foreach循環。我想顯示的結果是這樣的:如何格式化我的列表數組c#

TIME - TITLE - DESCRIPTION 
TIME2 - TITLE2 - DESCRIPTION2 

循環:

foreach (string[] array in log) 
{ 
    foreach (string element in array) 
    { 
     Console.WriteLine(element); 
    } 
} 

但目前的結果是這樣的:

TIME 
TITLE 
DESCRIPTION 

我如何格式化這個數組在我的列表中是否在同一行上?當第一個數組出現在第二行等等時?

+0

它看起來像你所要求實現[log4net的(https://logging.apache.org /log4net/release/config-examples.html)功能。檢查鏈接。 – KernelMode

回答

0

爲了以您要求的方式輸出字符串,您需要知道需要向每個字符串添加多少填充以確保-字符的排列。示例文本中的第一列最多有5個字符,因此第一行中的第一列需要添加一個額外的空間,以便在第二列開始之前使-字符排隊等等。

所以,首先你需要計算出每一列的max_lengths

var max_lengths = 
    log 
     .SelectMany(array => 
      array.Select((e, i) => new { length = e.Length, index = i })) 
     .GroupBy(x => x.index, x => x.length) 
     .Select(x => new { index = x.Key, max_length = x.Max() }) 
     .ToDictionary(x => x.index, x => x.max_length); 

這給:

max_lengths

現在你可以創建一個版本的log具有填充字符串:

var padded = 
    log.Select(array => 
     array.Select((e, i) => e.PadRight(max_lengths[i]))); 

現在的結果很簡單:

var result = String.Join(Environment.NewLine, padded.Select(x => String.Join(" - ", x))); 

那就是:

var log = new [] 
{ 
    new [] { "TIME", "TITLE", "DESCRIPTION" }, 
    new [] { "Happy Days", "Super Fun", "Woah!" }, 
    new [] { "Yes", "I can't complain", "simply stunning" }, 
}; 

這給:

 
TIME - TITLE - DESCRIPTION 
TIME2 - TITLE2 - DESCRIPTION2 

我們可以用一個更有趣的組輸入測試此

 
TIME  - TITLE   - DESCRIPTION  
Happy Days - Super Fun  - Woah!   
Yes  - I can't complain - simply stunning 
-1

以任何您想要的格式在字符串中附加值,然後顯示該字符串。 對於e.g

String s = s + element; 

Console.WriteLine(s); 
-1

隨着Console.Write(element + " - ");,你可以在一行寫的各種元素。每個元素之後都有一個「 - 」,所以它們是分開的。 在外部循環中,您希望Console.WriteLine();爲下一個元素打破新行。

只限於此問題:您的元素末尾會顯示「 - 」。看起來像:

TIME - TITLE - DESCRIPTION - 

由於@Roma

您可以編輯你的循環是這樣的:

foreach (string[] array in log) 
{ 
    foreach (string element in array) 
    { 
     Console.Write(element + " - "); 
    } 
Console.WriteLine(); 
} 

輸出應該是這樣的:

TIME - TITLE - DESCRIPTION - 
TIME2 - TITLE2 - DESCRIPTION2 - 
+0

最後會有'-':'TIME - TITLE - DESCRIPTION - ' –

+0

謝謝你的提示。這是我沒有想到的。我將編輯我的答案並提醒大家 – s0T7x

+0

你知道你所顯示的輸出不是你的代碼產生的嗎? – Enigmativity

-1

一個非常簡單的應用是joining字符串:

Console.WriteLine(string.Join(" - ", array)); 

結果恰好是您預期的字符串TIME - TITLE - DESCRIPTION

+0

爲什麼要添加'使用System.Linq'?你不要在你的代碼中使用它。 – KernelMode

+0

@KernelMode完全正確 - 我刪除它 – Fruchtzwerg

-1

可以說數組列表像:

List<string[]> arrayList = new List<string[]> 
    { 
     new string[] { "TIME1", "TITLE1" ,"DESCRIPTION1"}, 
     new string[] { "TIME2", "TITLE2" ,"DESCRIPTION2" } 

    }; 

然後foreach循環將是這樣的:

foreach (string[] array in arrayList) 
{ 
    Console.WriteLine(array[0] + " - " + array[1] + " - "+ array[2]); 
} 

輸出

TIME1 - TITLE1 - DESCRIPTION1 
TIME2 - TITLE2 - DESCRIPTION2