2011-07-16 84 views
0

我有3只列出了他們每個人都具有以下一些類的實例:使一些列表聯盟在C#

public class Menu 
{ 
    public string Address { get; set; } 
    public string Name { get; set; } 
    public List<Menu> Childs=new List<Menu>(); 
} 

我填補這些名單的每個人都在下面的代碼:

public List<Menu> GetAvailableMenus(string[] roles) 
{ 
    var adminMenu = new List<Menu>(); 
    var terminalMenu = new List<Menu>(); 
    var gaurdMenu = new List<Menu>(); 
    if(roles.Contains("admin")) 
    { 
     GetAdminMenus(adminMenu); 
    } 
    if (roles.Contains("terminal")) 
    { 
     GetTerminalMenus(terminalMenu); 
    } 
    if (roles.Contains("gaurd")) 
    { 
     GetGaurdMenus(gaurdMenu); 
    }      
    return adminMenu.Union(gaurdMenu).Union(terminalMenu).ToList(); 
} 

我問題是聯合行動只是將這些列表串聯起來,並且爲了移除多餘的項目而進行合併。 有沒有人知道我該怎麼辦?

回答

3

您還沒有覆蓋EqualsGetHashCodeMenu類,所以Union也沒辦法(除了引用相等,不會在這裏工作),要知道,有重複。以合理的方式實現這些方法將使您的代碼正常工作。

這些鏈接可能幫助:

或者,你可以通過在自己實現IEqualityComparer作爲另一種說法爲Union方法。

0

您的Menu類需要正確實施IEquatable<>以確定兩個條目是否相同。否則Union將使用默認的等式,它將比較引用相等。

0

如果你提供了一個聯盟的相等比較那麼這將是能夠合併,而不只是Concat的你的列表

http://msdn.microsoft.com/en-us/library/bb358407.aspx


更新 - 重讀你的問題,我想,如果你也要合併子菜單項。如果是這樣的話,那麼我認爲你需要編寫一些邏輯來做到這一點 - 我不認爲有任何使用Linq Union操作符來執行嵌套合併的方法。