Получить массив символов из свойства базового класса

Я относительно новичок в программировании, вот что я хочу сделать: у меня есть базовый класс, содержащий свойство «Оператор», его производные — это классы для математических операций, поэтому операторы — «-», «+» и т. д. Теперь я нужно создать массив этих операторов для использования в моем движке калькулятора. У меня есть только список методов операций, как мне извлечь только операторы и поместить их в массив? Это то, что у меня уже есть, но меня просят использовать уже существующие Операторы

char[] operatorArray = {'+', '-', '/', '*'};

            int indexOfLastOperatorBeforeSquare = leftOfSquare.LastIndexOfAny(operatorArray);

Это мой базовый класс, содержащий свойство оператора:

public abstract class OperationBase
{
    public abstract string Operator { get; set; }
    public abstract string Execute(string leftOperator, string rightOperator);
}

и это конструктор класса сложения в качестве примера:

public Addition()
    {
        Operator = "+";
    }

person tweedledum11    schedule 09.12.2015    source источник
comment
Вы можете использовать отражение, чтобы найти все типы, производные от OperationBase, создать их экземпляры и получить значение свойства. (Я бы сказал, что class Addition : OperatorBase должен иметь константу для своего оператора: он не может изменяться во время выполнения; это избавит от необходимости создавать его экземпляр, чтобы получить его оператор.)   -  person Richard    schedule 09.12.2015


Ответы (1)


Вероятно, вы получили OperationBase в таких классах, как Addition, Substraction, Division...

Если вы храните эти реализации в List<OperationBase> (т. е. добавляете экземпляры ко всему списку: list.Add(new Addition()); list.Add(new Subtraction()); и т. д.), вы можете извлечь операторы с помощью LINQ:

List<OperationBase> operations = new List<OperationBase>();
operations.Add(new Addition());
operations.Add(new Division());
operations.Add(new Subtraction());

IEnumerable<char> operators = operations.Select(operation => operation.Operator[0]);

Теперь весь operators можно преобразовать в массив, вызывающий operators.ToArray(), который будет содержать операторы в виде символов:

char[] operatorChars = operators.ToArray();

Обратите внимание, что мне пришлось получить символ оператора, используя operation.Operator[0]: ваш OperationBase определяет, что операции предоставляют свой оператор как string вместо char. Если вы хотите этого избежать, исправьте все свойство и приведите его к типу char, и код будет выглядеть следующим образом:

IEnumerable<char> operators = operations.Select(operation => operation.Operator);
person Matías Fidemraizer    schedule 09.12.2015
comment
Я уже создал этот список, потому что он мне был нужен раньше, я просто не знал, как убрать оттуда операторов, а LINQ — это то, чем я раньше не пользовался, думаю, мне придется узнать об этом. . Большое спасибо, это работает просто отлично! - person tweedledum11; 09.12.2015
comment
@ tweedledum11, это еще один сценарий: вы хотите получить операцию по ее типу. operations.OfType<Addition>().Single(). Это просто, чтобы открыть ваше любопытство ;) - person Matías Fidemraizer; 09.12.2015
comment
Мне определенно любопытно, спасибо за это, я на самом деле пробовал .OfType‹char› раньше, чтобы вывести Оператора из списка операций, но это не сработало, как я себе представлял: D. Сейчас я читаю об IEnumerable, мне определенно нужно понять вашу строку кода, не хочу, чтобы в моем коде было что-то, что просто волшебно работает, и я не понимаю, почему! - person tweedledum11; 09.12.2015