Я хочу написать строку с некоторыми переменными, но когда конкретное значение не нужно, его можно обрезать.
например.:
int apples = 5;
int oranges = 8
int bananas = 0;
string.Format("I got {0} apples, {1} oranges, {2} bananas.", apples, oranges, bananas)
Результат: У меня 5 яблок, 8 апельсинов, 0 бананов.
Я хочу отрезать ", 0 бананы", так как их здесь показывать не нужно. Мое единственное решение было бы if-states для каждого фрукта... Представьте, что у меня может быть 10 фруктов...
if (bananas == 0)
{
string.Format("I got {0} apples, {1} oranges.", apples, oranges)
}
Моя следующая проблема заключается в том, что у меня может быть более одного фрукта, равного 0. Это будет бесконечное if-состояние внутри if-состояния... Есть ли решение для решения этой проблемы в одной строке?
Я даже не знаю, что я могу здесь сделать. Я просто знаю способы инвертирования переменных с использованием оператора +
, с использованием string.Format()
или с использованием $
перед фактической строкой.
Большое спасибо! Нетрошин
Есть ли решение для решения этой проблемы в одной строке? Зачем вам одна линия? Вы пропустили уроки о читабельности и ремонтопригодности кода?
...а что, если все плоды равны нулю?...
@ user09938 фрукты - это просто пример, чтобы показать вам, что я хотел. Если быть точным: я хочу показать кому-то его статистику в своем боте для Twitch, некоторые статы могут быть нулевыми и их не нужно показывать, например престиж. вся строка может быть «Вы БЛЕСТЯЩИЙ покемон, которому нужно 345exp для повышения уровня, с ПРЕСТИЖОМ 2» (слова с заглавными буквами не нужны, если вы еще не блестящий или у вас еще нет уровня престижа)
@Idle_Mind строка содержит некоторую информацию, чтобы иметь смысл (у меня были только фрукты в качестве примера, чтобы лучше объяснить это), но вы можете сказать, что если там ничего нет, вы можете сказать: «У меня ничего нет»
Как насчет
StringBuilder sb;
sb.Append("I got ");
if (oranges > 0){
sb.Append(String.Format("{0} oranges,"));
}
if (apples > 0){
sb.Append(String.Format("{0} apples,"));
}
...
var res = sb.ToString();
Если у вас нет bananas
(но есть яблоки и/или апельсины), вы закончите предложение нежелательной запятой (,
). Например I got 2 apples, .
Ага, я оставил расшифровку знаков препинания в конце на оп.
Вам не нужно иметь кучу разных утверждений if
для каждой возможной комбинации, вы можете просто построить строку с одним if
для каждого фрукта. Это можно упростить с помощью тернарного оператора ?:
, который имеет условие в левой части ?
, за которым следует результат, если условие истинно, затем :
, за которым следует результат, если условие ложно. Поскольку нам нужна запятая в конце каждой строки, я добавил TrimEnd(',')
, чтобы удалить последнюю:
string result = "I got" +
((apples > 0 ? $" {apples} apples," : "") +
(oranges > 0 ? $" {oranges} oranges," : "") +
(bananas > 0 ? $" {bananas} bananas" : "")).TrimEnd(',');
Вы также можете подумать о том, чтобы лучше структурировать свои данные. Вместо того, чтобы хранить их как типы int
, вы можете создать свой собственный тип, который имеет как имя string
, так и количество int
. Таким образом, вы можете отфильтровать список этих предметов по количеству (удалить все, где quantity == 0
), а затем распечатать их, используя свойство Name
.
Например:
public class Fruit
{
public string Name { get; set; }
public int Quantity { get; set; }
}
public class Program
{
// Create a list of fruits
List<Fruit> fruits = new List<Fruit>();
fruits.Add(new Fruit { Name = "Apples", Quantity = 5 });
fruits.Add(new Fruit { Name = "Oranges", Quantity = 8 });
fruits.Add(new Fruit { Name = "Bananas", Quantity = 0 });
string result = "I got " + string.Join(", ", fruits
.Where(fruit => fruit.Quantity > 0)
.Select(fruit => $"{fruit.Quantity} {fruit.Name}"));
Console.WriteLine(result);
Console.ReadKey();
}
Спасибо! это очень полезно и именно то, что мне нужно. большое спасибо!
"@" + ChatName + " You are a " + ((Trainer[1] == "No" ? "" : "shiny ") + PokeName + " Level " + ActualLevel + ", you have " + ExperiencePoints + "EXP and " + (ActualLevel < 100 ? "need " + ExperiencePointsToNextLevel + "EXP for the next level!" : "therefore " + ExperiencePointsOverflow + "EXP more than you need! You can use Prestige!")
Раньше было 25 LoC, теперь 4 LoC. очень хорошо!
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp_StackoverflowAnswering1
{
class Fruit
{
public String Name;
public int Value;
public Fruit(String name, int value)
{
this.Name = name;
this.Value = value;
}
}
class Program
{
static void Main(string[] args)
{
List<Fruit> myFruits = new List<Fruit> { new Fruit("Banana", 0),
new Fruit("Apple", 5),
new Fruit("Orange", 10) };
String output = $"I got {String.Join(", ", myFruits.Where(fruit => fruit.Value > 0).Select(fruit => $"{fruit.Name} = {fruit.Value}"))}.";
Console.WriteLine(output);
}
}
}
с кортежем (имя, количество) вы можете использовать: $"I got {string.Join(", ", new List<(string name, int count)>() { ("apples", 5), ( "апельсины", 8), ("бананы", 0) }.Where(i => i.count > 0).Select(i => $"{i.count} {i.name}"))}. "