Создайте строку с переменными, отсекая нулевые переменные

Я хочу написать строку с некоторыми переменными, но когда конкретное значение не нужно, его можно обрезать.

например.:

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 04.02.2023 01:40

...а что, если все плоды равны нулю?...

Idle_Mind 04.02.2023 01:49

@ user09938 фрукты - это просто пример, чтобы показать вам, что я хотел. Если быть точным: я хочу показать кому-то его статистику в своем боте для Twitch, некоторые статы могут быть нулевыми и их не нужно показывать, например престиж. вся строка может быть «Вы БЛЕСТЯЩИЙ покемон, которому нужно 345exp для повышения уровня, с ПРЕСТИЖОМ 2» (слова с заглавными буквами не нужны, если вы еще не блестящий или у вас еще нет уровня престижа)

Netroshin 04.02.2023 23:31

@Idle_Mind строка содержит некоторую информацию, чтобы иметь смысл (у меня были только фрукты в качестве примера, чтобы лучше объяснить это), но вы можете сказать, что если там ничего нет, вы можете сказать: «У меня ничего нет»

Netroshin 04.02.2023 23:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
5
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как насчет

 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, .

dimitar.d 04.02.2023 01:42

Ага, я оставил расшифровку знаков препинания в конце на оп.

pm100 05.02.2023 04:10
Ответ принят как подходящий

Вам не нужно иметь кучу разных утверждений 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();
}

Спасибо! это очень полезно и именно то, что мне нужно. большое спасибо!

Netroshin 04.02.2023 23:45
"@" + 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. очень хорошо!
Netroshin 05.02.2023 00:35
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);
        }
    }
}

Другие вопросы по теме