2015-10-14 31 views
0

我創造了一些自定義funcs中,然後將它們添加到funcs中被稱爲運營商的名單,因爲這樣的:在用戶執行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

根據功能顯示名稱的順序進行排序的功能,你可以創建一個'詞典<字符串,Func鍵<的Vector3,的Vector3 >>'你顯示的字符串映射到用戶每個功能。然後你循環選擇並查找來找到正確的函數來執行。 – Rob

+0

我將如何存儲執行的*訂單*?第一個字典中的第一項要執行,第二個字典中的第二個要執行等等? – kskyriacou

+0

對我來說,感覺就像是在問如何根據用戶的選擇來填充一個列表 - 這聽起來對我來說太寬泛了......但我可能錯過了一些東西。 –

回答

1

我想包的Func鍵代表的一類,而我會定義一個該類的屬性代表您需要執行Funcs的順序。

然後使用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; } 
} 

這僅僅是一個粗略的想法。根據需要調整。

乾杯

+0

好主意,我甚至可以綁定到我的視圖中的包裝中的屬性,以便用戶排序可以通過綁定來完成。非常感謝! – kskyriacou

+0

對!我喜歡這樣的場景:-) –

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); 
     ... 
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