在一个数组或列表中找到类型相等并执行操作。 C#

find type equality in one array or list and perform operation. C#

如何在一个数组中找到类型相等性。或列出 我正在使用这些 类:

public class Expression
{
    public Expression[] Par { get; }
    public string Opr { get; }

    public Expression(string opr,params Expression[] par)
    {
        Opr = opr;
        Par = par;
    }

    protected Expression()
    {
    }
}

public class VarExpression : Expression
{
    public char Var { get; set; }
}

public class ConstExpression : Expression
{
    public double Val { get; set; }
}

我有 Par 作为 Expression

的数组类型

但是一个索引可以是 VarExpressionConstExpression 类型 太...或者只是 Expression

因为 VarExpressionConstExpression 类 都是表达式类型所以我需要首先检查它是 VarExpression 还是 ConstExpression 以及它是否不是其中最后 Expression。 最后对它们进行一些操作,例如添加或其他操作,并将结果存储在新列表中并转换为数组。 请注意,我需要在一个数组中进行比较。

我搜索了但找不到任何东西。也许这个问题重复但我找不到任何东西来得到我的答案

我已经知道了一些方法,但我想知道最好的、最清晰的、高效的、性能好的方法。

我知道的方式

for (int i = 0; i < expression.Par.Length - 1; i++)
{
    for (int j = i + 1; j < expression.Par.Length; j++)
    {
        if (expression.Par[i] is VarExpression && expression.Par[j] is VarExpression)
        {
            //add and store in list
        }
        else if (expression.Par[i] is ConstExpression && expression.Par[j] is ConstExpression)
        {
            //add and store in list
        }
        else //finaly both or one is only Expression
        {
            //add and store in list
        }
    }
}
// convert list to new array

使用 lambda 表达式

var vars = expression.Par.Select(x => x.GetType() == typeof(VarExpression)).ToList() ;

var cons = expression.Par.Select(x => x.GetType() == typeof(ConstExpression)).ToList() ;

然后你可以随心所欲地使用你的表情

使用offtype方法获取只包含所需类型的子集非常简单。

var vars = expression.Par.OfType<VarExpression>()

或者如果您想在 foreach 中处理它们:

foreach (VarExpression variable in expression.Par.OfType<VarExpression>())
{
    //processs
}