以用户定义的顺序执行 Func 委托

Executing Func delegates in user defined order

我创建了一些自定义 Func,然后将它们添加到名为 Operators 的 Func 列表中,如下所示:

...
    Func<Vector3, Vector3> Move1MFunc = (v) => v.Z == 0 ? v.Add(1, 0, 1) : v.Subtract(1, 0, 1);

    Func<Vector3, Vector3> Move2MFunc = (v) => v.Z == 0 ? v.Add(2, 0, 1) : v.Subtract(2, 0, 1);

    protected List<Func<Vector3, Vector3>> Operators { get; set; }
...

在其他一些方法中,我遍历 Operators 列表并执行每个委托:

    protected IEnumerable<Vector3> GetChildrenStates(Vector3 parentState)
    {
        foreach (var op in Operators)
        {
            // Get a child using the current operator
            var possibleChild = op(parentState);
            ...

现在每个委托都根据其在列表中的顺序执行。我希望用户能够定义每个函数的执行顺序(相对于彼此)。我会向用户展示一些代表每个代表的字符串,并在 link 后面的代码中将它们呈现给代表本身(?)。我正在使用 MVVM。

我尝试过使用属性来执行此操作,但据我发现属性不支持 Funcs。

我似乎想不出其他解决方案,所以我问你。我才刚刚开始使用 Funcs,如果有人有任何改进意见,我会很乐意考虑。

您可以像这样创建字典实例 OperatorsWithTypes 和函数 GetOrderedOperators

    protected static Dictionary<string, Func<Vector3, Vector3>> OperatorsWithTypes 
    { get; set; }

    public static List<Func<Vector3, Vector3>> GetOrderedOperators()
    {
        return (from category in OperatorWithTypes
            orderby
                category.Key == "First"
                    ? 0
                    : category.Key == "Second"

                        ? 1
                        : category.Key == "Third"

                            ? 2
                            : category.Key == "Forth"

                                ? 3
                                : category.Key == "5th"

                                    ? 4
                                    : category.Key == "6th"
                                        ? 5
                                        : -1
            select category.Value)
            .ToList();
    }

并称它为:

foreach (var op in GetOrderedOperators())
    {
        // Get a child using the current operator
        var possibleChild = op(parentState);
        ...

我会将 Func 委托包装在 class 中,然后在 class 上定义一个 属性 来表示您需要执行 Func 的顺序。

然后使用 Linq 的 OrderBy,你可以这样做:

//Defined in some class
protected List<FuncWrapper> Operators { get; set; }

private void CreateFunctors()
{

    Operators.Add(new FuncWrapper { Functor = (v) => v.Z == 0 ? v.Add(1, 0, 1) : v.Subtract(1, 0, 1), Order = 1 });
    Operators.Add(new FuncWrapper { Functor = (v) => v.Z == 0 ? v.Add(2, 0, 1) : v.Subtract(2, 0, 1), Order = 2 });

}

private void CallFunctors()
{
    Vector3 v = new Vector3();

    foreach (var f in Operators.OrderBy(o => o.Order))
        f.Functor(v);
}

//Defined somewhere else
public class FuncWrapper
{
    public Func<Vector3, Vector3> Functor { get; set; }
    public int Order { get; set; }
}

这只是粗略的想法。根据需要进行调整。

干杯

你可以这样做:

首先定义将名称映射到函数的字典,如下所示:

Dictionary<string, Func<Vector3, Vector3>> Operators = new Dictionary<string, Func<Vector3, Vector3>>()
{
    {"function1_display_name", Move1MFunc},
    {"function2_display_name", Move2MFunc}
};;

然后假设您从用户那里收集了一个包含函数显示名称的 List<string>,您可以像这样创建一个函数列表:

// list_of_names_from_user is the list of function names collected from the user
List<string> list_of_names_from_user = ......

List<Func<Vector3, Vector3>> ordered_functions =
    list_of_names_from_user.Select(x => Operators[x]).ToList();

现在 ordered_functions 将包含根据 list_of_names_from_user

中函数显示名称顺序排序的函数