【问题标题】:Get array of chars from a base class property从基类属性中获取字符数组
【发布时间】:2016-03-14 16:05:04
【问题描述】:

我对编程比较陌生,这就是我想做的事情: 我有一个包含属性“运算符”的基类,它的派生类是用于数学运算的类,因此运算符是“-”“+”等。现在我需要创建一个这些运算符的数组以在我的计算器引擎中使用。我只有一个操作方法列表,如何只提取操作符并将它们放入数组中?这是我已经拥有的,但我被要求使用已经存在的运营商

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

            int indexOfLastOperatorBeforeSquare = leftOfSquare.LastIndexOfAny(operatorArray);

这是包含 Operator 属性的基类:

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

以Addition Class的构造函数为例:

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

【问题讨论】:

  • 您可以使用反射来查找从OperationBase 派生的所有类型,实例化它们并获取属性值。 (我认为class Addition : OperatorBase 的运算符应该有一个 const:它不能在运行时更改;这样就不需要实例化它来获取它的运算符。)

标签: c# arrays properties calculator base-class


【解决方案1】:

您可能在 AdditionSubstractionDivision 等类中派生了 OperationBase...

如果您将这些实现存储在 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);

【讨论】:

  • 我已经创建了该列表,因为我以前需要它,我只是不知道如何让运算符离开那里,而 LINQ 是我以前没有使用过的东西,我想我'我必须让自己接受这方面的教育。非常感谢,效果很好!
  • @tweedledum11 这是另一种情况:您想按其类型获取操作。 operations.OfType&lt;Addition&gt;().Single()。这只是为了打开你的好奇心;)
  • 我很好奇,谢谢,我之前实际上尝试过 .OfType 将 Operator 从操作列表中删除,但这并没有像我想象的那样工作:D。我现在正在阅读有关 IEnumerable 的信息,我绝对需要了解您那里的代码行,不希望我的代码中有任何东西在我不理解为什么的情况下神奇地起作用!
猜你喜欢
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多