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

时间:2015-10-14 23:00:50

标签: c# mvvm func

我创建了一些自定义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; }
...

在其他一些方法中,我正在迭代运算符列表并执行每个委托:

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

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

我尝试过使用属性,但是从我发现的属性不支持Funcs。

我似乎无法想到另一种解决方案,因此我问你。我刚刚开始使用Funcs,如果有人有任何改进意见,我很乐意考虑它们。

3 个答案:

答案 0 :(得分:1)

我会将Func委托包装在一个类中,并且我在该类上定义一个属性,表示您需要执行Func的顺序。

然后使用Linq&#39; 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; }
}

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

干杯

答案 1 :(得分:1)

您可以这样做:

首先定义将名称映射到这样的函数的字典:

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

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

答案 2 :(得分:0)

您可以像这样创建字典实例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);
        ...