2017-08-22 5 views
0

J'ai reçu l'affectation de créer un rectangle vide en utilisant Enumerable.Repeat au lieu de boucles imbriquées. Je l'ai fait comme ça.C# Rectangle creux utilisant 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); 
    } 

Il fonctionne très bien, mais la partie creuse, je l'ai conçu ne semble pas LE CHEMIN aller si vous savez ce que je veux dire ... Quelle serait la façon la plus efficace d'aller? Exclusion de l'utilisation de StringBuilder.

+1

que diriez-vous que vous utilisez 'Enumerable.Repeat' pour créer 1 ligne, puis utilisez à nouveau' Enumerable.Repeat', sur cette ligne 1 pour créer des lignes N? –

Répondre

1

Vous pouvez mettre en cache les lignes et les 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

Dans ce cas, il existe un constructeur de chaîne qui constitue un meilleur choix. Voici juste un segment de l'original pour démontrer:

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

De plus, vous pouvez simplifier le tout en plaçant les rangées supérieure et inférieure à l'extérieur de la boucle:

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

Il ne sert à rien d'appeler 'String.Concat' ici. – Servy

+0

@Servy C'était juste pour aider à s'adapter en contexte avec son code précédent. –

+0

Le but de l'exercice est d'utiliser concat et Enumerable.Repeat ... –