我创建了一些自定义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,如果有人有任何改进意见,我很乐意考虑它们。
答案 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);
...