2017-08-22 6 views
0

ネストされたループの代わりにEnumerable.Repeatを使用して中空の矩形を作成する割り当てが与えられました。私はこれのようにやった。C#Enumerable.Repeat()を使用している中空の矩形

string str; 
int rows = 5; 
int cols = 15; 

for (int i = 1; i <= rows; i++) 
{ 
    if (i == 1 || i == rows) 
    { 
     str = string.Concat(Enumerable.Repeat("*", cols)); 
     Console.WriteLine(str); 
    } 
    else 
    { 
     str = string.Concat(Enumerable.Repeat(" ", cols - 2)); 
     str = string.Concat("*", str, "*"); 
     Console.WriteLine(str); 
    } 

それはうまく動作しますが、あなたは私が何を意味するか知っていれば私が設計した中空部がのように移動するための方法をいないようですが...何が行くための最も効率的な方法だろうか? StringBuilderの使用を除外します。

+1

あなたは1行を作成するために 'Enumerable.Repeat'を使用についてどのように、その後、N行を作成するために、その1行目に、再び' Enumerable.Repeat'を使うのか? –

答えて

1

あなたがラインをキャッシュすることができますそしてJoinそれら:

string top = new string('*', cols); 
string body = "*" + new string(' ', cols - 2) + "*"; 

string result = string.Join(Environment.NewLine, 
    top, 
    string.Join(Environment.NewLine, Enumerable 
    .Repeat(body, rows - 2)), 
    top); 

Consol.Write(result); 
-1

この場合、より良い選択肢である文字列コンストラクタがあります。ここで実証する元からわずか1セグメントである:

if (i == 1 || i == rows) 
{ 
    str = string.Concat(new string('*', cols)); 
    Console.WriteLine(str); 
} 

また、あなたはループの外で上部と下部の行を入れて全体を簡素化することができます。

int rows = 5; 
int cols = 15; 

Console.WriteLine(new string('*', cols); 
foreach(string line in Enumerable.Repeat("*".Concat(new string(' ', cols-2)).Concat("*"), rows-2)) 
{ 
     Console.WriteLine(line); 
} 
Console.WriteLine(new string('*', cols); 
+1

ここで 'String.Concat'を呼び出すことには意味がありません。 – Servy

+0

@Servyそれはちょうど前のコードとの文脈に合うのを助けることでした。 –

+0

練習の要点は、concatとEnumerableを使用することです。Repe ... –

関連する問題