以用户定义的顺序执行 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
中函数显示名称顺序排序的函数
我创建了一些自定义 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