2012-12-21 109 views
0

是否有方法將方法作爲參數傳遞給函數,然後通過list.Sort()調用它?我試過這個:將方法作爲參數傳遞給函數

public static string BuildHumanSitemap(Func<TreeNode, TreeNode, int> sortMethod, params string[] classNames) 
{ 
    //calling list sort on method passed as parameter 
    nodes.sort(sortMethod); 
} 

在我想要傳遞的函數都採用相同的參數例如

private static int SortByDateCreated(TreeNode x, TreeNode y) 
{ 
    DateTime xT = (DateTime)x["DocumentCreatedWhen"]; 
    DateTime yT = (DateTime)y["DocumentCreatedWhen"]; 
    return xT.CompareTo(yT); 
} 

我使用Action委託類型,但排序方法也試過當我把它作爲一個參數抱怨。任何人都可以提供關於如何做到這一點的建議?

三江源

+0

你能告訴我們你試過了什麼嗎?另外,你說當你使用Action時,排序方法會抱怨,你能否發佈錯誤信息? – Jetti

+0

節點類型是什麼?更具體地說,「排序」方法的簽名是什麼? –

+1

如果您在討論'List .Sort',該方法不會提供一個需要委託的重載。 –

回答

3

創建新的比較委託,並把它傳遞給排序方法:

nodes.Sort(new Comparison<TreeNode>(sortMethod)); 
+1

完美,非常感謝 – DGibbs

0

它的工作原理是這樣的:

TreeView.TreeViewNodeSorter = new CustomNodeSorter(); 

    private class CustomNodeSorter : IComparer 
    { 
    public int Compare(object x, object y) 
    { 
     DateTime xT = (DateTime)x["DocumentCreatedWhen"]; 
     DateTime yT = (DateTime)y["DocumentCreatedWhen"]; 
     return xT.CompareTo(yT); 
    } 
    } 
0

解決方案與IComparer<T>

的Comparer

public class MyTreeNodeComparer : IComparer<TreeNode> 
{ 
    public int Compare(TreeNode x, TreeNode y) 
    { 
     DateTime xT = (DateTime)x["DocumentCreatedWhen"]; 
     DateTime yT = (DateTime)y["DocumentCreatedWhen"]; 
     return xT.CompareTo(yT); 
    } 
} 

使用

list.Sort(new MyTreeNodeComparer()); 
2

也許,而不是採取在Func<,,>代表,您應該使用Comparison<>代表。因爲這是List<>想要的(由於歷史原因; List<>.Sort方法是爲.NET 2.0編寫的,所以在Func代表被引入之前)。

因此:

public static string BuildHumanSitemap(Comparison<TreeNode> sortMethod, params string[] classNames) 
{ 
    //calling list sort on method passed as parameter 
    nodes.Sort(sortMethod); 
} 

然後打電話給你的方法非常簡單地像這樣:

BuildHumanSitemap(SortByDateCreated); 

其中SortByDateCreated是從你的問題的 「方法組」。

不需要先創建Func<TreeNode, TreeNode, int>類型的委託實例,然後創建引用第一個委託實例(類型Comparison<TreeNode>)的另一個委託實例。

當然你也可以用lambda箭頭作爲第一個參數來調用你的BuildHumanSitemap方法。

+0

我喜歡這種方式更好,有一個+1 – DGibbs

+0

@DGibbs謝謝。你甚至可以改變你的「接受」標記'✔'以表達這個答案(但只有當你覺得它比你之前接受的答案更好時)。 –

相關問題