問題は、1つの列に複数の項目があることです。新しい行を作成するのではなく、項目を分割することで簡単に解決できます。 \n
の代わりに;
を使用しています。コメントをもとに
string ut = "1Y, 4D, 01:23:45";
string met = "T+4D, 01:11:32";
string vesselName = "Saturn K";
string vesselModules = "Command/Service Module;Munar Excursion Module";
string kerbals = "Valentina Kerman, Pilot;Jebediah Kerman, Pilot;Bill Kerman, Engineer;Bob Kerman, Scientist";
string[] headerNames = { "UT:", "MET:", "Vessel:", "Modules:", "Crew:" };
string[] headerData = new string[5] { ut, met, vesselName, vesselModules, kerbals };
for (int index = 0; index < headerNames.Length; index++)
{
// Split data if there are more than one.
var items = headerData[index].Split(';');
if (items.Length > 1)
{
// We got more than one item. Render first item.
Console.WriteLine("{0,-12} {1,-46}", headerNames[index], items[0]);
for (int i = 1; i < items.Length; i ++)
{
// Render the following items.
Console.WriteLine("{0,-12} {1,-46}", string.Empty, items[i]);
}
}
else
{
// Only one item. Render it as usual.
Console.WriteLine("{0,-12} {1,-46}", headerNames[index], headerData[index]);
}
}
編集:
Console.WriteLine
がstring.Format()
パターンを使用しています。 Console
から:基本的には、渡されたパラメータを持つすべての{}
を置き換えると言う
// Writes out a formatted string and a new line. Uses the same
// semantics as String.Format.
//
public virtual void WriteLine (String format, params Object[] arg)
{
WriteLine(String.Format(FormatProvider, format, arg));
}
。プレースホルダーとして{}
を表示できます。私は単純に空の値を使うべきだと言った。
例:
Console.WriteLine("{0} - {1} - {2}", "One", "Two", "Three");
出力:
One - Two - Three
これは非常に問題になっている例のようなものですが、問題も{0,-12}
を使用して、表示されるべき文字の数を定義します。私がしたことは、単に ""のような空の文字列を渡すことです。
Console.WriteLine("{0} - {1} - {2}", "One", string.Empty, "Three");
出力:
One - - Three
そして、私のコードで私は単に最初の12の文字は何に置き換えされるべきではないと言うが、それでも12個の文字を使用します。
Console.WriteLine("{0,-12} {1,-46}", string.Empty, "Some value");
あなたはここString.Formatの詳細を読むことができます:
http://www.dotnetperls.com/format
インクリメントに関して、私がしたのはあなたの値で配列を埋めることでした。それが2つ以上の値であることが検出された場合、私は2行目(およびそれに続くすべて)に「空のヘッダ」がなければならないことを知っています。 string.EmptyをConsole.WriteLineに渡すと、空のヘッダー(ただしヘッダー)がレンダリングされます。
擬似コード:
Split by ';'.
Is there more than one item? If yes, goto 1. If no, goto 2.
1. Render first line with header and first data.
1.1 Render all the other lines, but with an empty header (still taking up 12 chars).
2. Render line with header and data.
恐ろしいです!本当にありがとう!簡単な質問:私はstring.Splitを取得すると、その文字をマーカーとして使用して文字列を分割しますが、実際に増分とstring.Emptyパーツは何を理解していません。 "items"の長さに "i"をインクリメントすると、 ";"次の行に?私はMSDNのガイドを読むのに最善を尽くしていますが、私はそれだけを理解しています。 – blorgon
@blorgon私は自分の答えを編集しました。私はそれが論理を説明することを願っています。そうでない場合は、もう一度お尋ねください。 – smoksnes
うわー!上およびそれ以上!本当にありがとう。 – blorgon