Este código lê o diâmetro e a altura do barril do arquivo, então, com base na dimensão, tome decisões e, finalmente, essas decisões são impressas em um arquivo. Meu pronbelm é como evitar o uso do código escrito nas linhas 70-101? Provavelmente tem a ver com a linha 35, mas ainda não descobri como contorná-la. Seria bom se houvesse uma maneira (chance) de tornar este código mais curto.
PS d - diâmetro, h - altura
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace TaaviSimsonTest
{
class Program
{
static void Main(string[] args)
{
//Reads values from an input file
var numbersList = File.ReadAllLines("C:\\temp\\vaaditest07.txt")
.Select(line => line.Split(' '))
.Select(barrels => new
{
diameter = int.Parse(barrels[0]),
height = int.Parse(barrels[1])
})
.ToArray();
//Puts diameter and height values to arrays
int[] d = numbersList.Select(x => x.diameter).ToArray();
int[] h = numbersList.Select(x => x.height).ToArray();
//Displays numbersList with line number, diameter and height
for (int i = 0; i < d.Length; i++)
{
Console.WriteLine("Line {0}: diameter: {1}, height: {2}",
i, d[i], h[i]);
}
//comparing barrel sizes and making a decision
List<string> output = new List<string>();
for (int j = 0; j < (d.Length - 1); j++)
{
int a = j + 1;
int b = j + 2;
if (d[j] > d[j + 1] && h[j] > h[j+1])
{
string command = a + "<-" + b; //1 <- 2, if j = 0
output.Add(command); //puts command in array
}
else if (d[j] < d[j + 1] && h[j] < h[j+1])
{
string command = a + "->" + b;
output.Add(command);
}
else if (d[j+1] < h[j] &&
((d[j+1] * d[j+1] + h[j+1] * h[j+1]) <
d[j] * d[j]))
{
string command = a + "<-" + b; // 2 <- 3
output.Add(command);
}
else if(d[j] < h[j+1] &&
((d[j] * d[j] + h[j] * h[j]) <
d[j+1] * d[j+1]))
{
string command = a + "->" + b;
output.Add(command);
}
else
{
string command = a + "--" + b;
output.Add(command);
}
}
//how to avoid this cycle?
int c = 1;
int e = d.Length;
if (d[0] > d[d.Length - 1] && h[0] > h[d.Length - 1])
{
string command = c + "<-" + e;
output.Add(command);
}
else if (d[0] < d[d.Length - 1] && h[0] < h[d.Length-1])
{
string command = c + "->" + e;
output.Add(command);
}
else if (d[d.Length-1] < h[0] &&
((d[d.Length-1] * d[d.Length-1] + h[d.Length-1] * h[d.Length-1]) <
d[0] * d[0]))
{
string command = c + "<-" + e;
output.Add(command);
}
else if (d[0] < h[d.Length-1] &&
((d[0] * d[0] + h[0] * h[0]) <
d[d.Length-1]*d[d.Length-1]))
{
string command = c + "->" + e;
output.Add(command);
}
else
{
string command = c + "--" + e;
output.Add(command);
}
//Writes values of array to a new file
String[] outputlist = output.ToArray();
File.WriteAllLines(@"C:\Temp\barrelsOutput.txt", outputlist);
//Displaying output in console
Console.WriteLine("");
foreach (var item in outputlist)
{
Console.WriteLine(item.ToString());
}
}
}
}
Algumas notas :
Parsevalores diretamente como, a int.Parsemenos que você tenha certeza de que será um valor válido; em vez disso, use int.TryParsepara evitar exceções.File.WriteAllLinesaceita IEnumerableisso significa, você pode passar o List<string>diretamente, portanto, não há necessidade de convertê-lo em array.string.Joinpode concatenar um Listou Arrayem um, stringentão use isso a seu favor.Sua pergunta sobre esta parte do código:
if (d[0] > d[d.Length - 1] && h[0] > h[d.Length - 1])
{
string command = c + "<-" + e;
output.Add(command);
}
else if (d[0] < d[d.Length - 1] && h[0] < h[d.Length-1])
{
string command = c + "->" + e;
output.Add(command);
}
else if (d[d.Length-1] < h[0] &&
((d[d.Length-1] * d[d.Length-1] + h[d.Length-1] * h[d.Length-1]) <
d[0] * d[0]))
{
string command = c + "<-" + e;
output.Add(command);
}
else if (d[0] < h[d.Length-1] &&
((d[0] * d[0] + h[0] * h[0]) <
d[d.Length-1]*d[d.Length-1]))
{
string command = c + "->" + e;
output.Add(command);
}
else
{
string command = c + "--" + e;
output.Add(command);
}
Esta parte precisa ser movida para um método e torná-la mais generalizada para ser reutilizada, assim:
private static string GetCommand(int currentDiameter , int nextDiameter , int currentHeight , int nextHeight)
{
var currentDiameterMultiplied = currentDiameter * currentDiameter;
var nextDiameterMultiplied = nextDiameter * nextDiameter;
var currentHeightMultiplied = currentHeight * currentHeight;
var nextHeightMultiplied = nextHeight * nextHeight;
if(currentDiameter > nextDiameter && currentHeight > nextHeight)
{
return "<-";
}
if(currentDiameter < nextDiameter && currentHeight < nextHeight)
{
return "->";
}
if(nextDiameter < currentHeight && ( ( nextDiameterMultiplied + nextHeightMultiplied ) < currentDiameterMultiplied ))
{
return "<-";
}
if(currentDiameter < nextHeight && ( ( currentDiameterMultiplied + currentHeightMultiplied ) < nextDiameterMultiplied ))
{
return "->";
}
return "--";
}
agora você pode reutilizá-lo em seu código, aqui está a versão modificada de seu código:
static void Main(string[] args)
{
//Reads values from an input file
var path = "C:\\temp\\vaaditest07.txt";
if(!File.Exists(path)) { throw new FileNotFoundException(nameof(path)); }
var data = File.ReadAllLines(path);
if(data == null) { throw new ArgumentNullException(nameof(data)); }
var numbersList = data
.Select(line =>
line.Split(' ')
.Select(barrels => new
{
Diameter = int.TryParse(barrels[0], out var diameter) ? diameter : 0,
Height = int.TryParse(barrels[1], out var height) ? height : 0
}).ToArray();
//comparing barrel sizes and making a decision
var output = new List<string>();
var length = numbersList.Length;
var command = string.Empty;
for(int index = 0, nextIndex = 1; index < length; index++, nextIndex++)
{
var current = numbersList[index];
var next = numbersList[nextIndex];
// Displays numbersList with line number, diameter and height
Console.WriteLine("Line {0}: diameter: {1}, height: {2}" , index , current.Diameter , current.Height);
if(index != length - 1)
{
var commandSymbol = GetCommand(current.Diameter , next.Diameter , current.Height , next.Height);
command = $"{nextIndex}{commandSymbol}{nextIndex + 1}"; } else { var commandSymbol = GetCommand(numbersList[0].Diameter , current.Diameter , numbersList[0].Height , current.Height); command = $"{0}{commandSymbol}{length}";
}
output.Add(command);
}
// Writes values of array to a new file
File.WriteAllLines(@"C:\Temp\barrelsOutput.txt" , output);
//Displaying output in console
Console.WriteLine();
Console.WriteLine(string.Join(Environment.NewLine, output));
}
Eu aconselharia começar escrevendo um código que seja realmente legível. Também pela sua pergunta, eu realmente não sei qual é o seu objetivo.
Você quer um código curto que faça o trabalho? Então eu diria que você já está lá. Se você deseja um código legível e sustentável, tente uma abordagem OO, em que você encapsula pedaços de código em objetos que, com seus nomes e métodos, documentam o que realmente está fazendo.
Porque estou muuuuito com preguiça de interpretar o que você está tentando fazer nas linhas 70-101. Eu quero ler os nomes e títulos e saber disso.
Então, esses são meus dois centavos
Jana Duggar foi aberta sobre sua busca pelo amor. Aqui está tudo o que ela disse sobre o assunto e sua janela de cinco anos para o casamento.
O astro de 'Outlander', Sam Heughan, revelou recentemente o que vai levar do set para relembrar Jamie Fraser, o papel que o tornou uma estrela.
'She Loves You' foi escrita em uma hora, gravada em um dia, e foi a música dos Beatles com uma de suas melhores apresentações de sua carreira.
Dolly Parton e sua avó Bessie tiveram um relacionamento especial. Vovó Parton estava muito doente, mas isso não impediu Dolly de pregar uma peça nela.
Você pode achar que o carvalho ou a nogueira são madeiras resistentes, mas quando se trata da madeira mais dura do mundo, elas nem chegam perto.
O oceano é repleto de beleza, mas também esconde algumas das criaturas marinhas mais assustadoras do planeta. Muitos desses animais espreitam nas profundezas do oceano, no mundo escuro e de alta pressão do fundo do mar.
Se você está enfrentando criaturas hostis ou se preparando para cenários PvP, conhecer os melhores encantamentos de espada no Minecraft pode te dar uma grande vantagem. Encantar espadas permite causar mais dano, aumentar a quantidade de itens obtidos de criaturas e prolongar a durabilidade da sua espada.
Quando as pessoas falam sobre países socialistas, geralmente imaginam o controle total do governo e a ausência de propriedade privada. Mas, na prática, as economias socialistas variam muito.
“Children” traz uma participação especial de grande nome e algumas notícias devastadoras
Este RAV4 está em excelentes condições e está preparado para um jogo de cadeiras musicais.
Imagens de drone capturaram bombeiros parecendo lutar para apagar o incêndio.
Eyes of Wakanda está diretamente relacionado ao MCU, além de atualizações sobre X-Men '97, What If..., Demolidor e muito mais.
O anel de noivado de Kate Middleton pertenceu à Princesa Diana antes do Príncipe William pedi-la em casamento. Descubra tudo o que há para saber sobre a peça histórica aqui.
John Cleese se casou com sua esposa, Jennifer Wade, em 2012. Aqui está tudo o que você precisa saber sobre a esposa de John Cleese, Jennifer Wade.
Patton Oswalt se casou com sua esposa, a também atriz Meredith Salenger, em 2017. Aqui está tudo o que você precisa saber sobre a esposa de Patton Oswalt, Meredith Salenger.
Mena Suvari é casada com o marido Michael Hope desde 2018. Aqui está tudo o que você precisa saber sobre o marido de Mena Suvari.
Isso me atinge De repente, como tantas vezes acontece É o meio do caminho tudo de novo <Não, não aquele no Pacífico, seu marrom, aquele no carnaval> Todas as manchetes em voz alta…..
Em 2022, com o lançamento do GPT-3, a habilidade de escrita parece se tornar menos importante. Com a IA, pessoas com redação ruim também podem gerar funcionários de qualidade.
No mundo acelerado e competitivo de hoje, a carreira desempenha um papel significativo no crescimento pessoal, na estabilidade financeira e na satisfação geral com a vida. No entanto, muitos indivíduos encontram-se presos em um ciclo implacável de estagnação e insatisfação, definhando gradualmente em suas vidas profissionais.
Na semana passada, notei um comunicado de imprensa, enviado via PressGazette (um site de notícias da mídia britânica). O artigo anunciava que a Acast, a empresa de publicidade e hospedagem de podcast Scandi, lideraria um consórcio de "provavelmente os editores mais influentes" em podcasting.