2011-07-16 10 views
0

にいくつかのリスト連合を作るは、私はそれらの一つ一つには、以下のクラスのいくつかのインスタンスを持つ3つのリストを持っているのC#

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

あなたはMenuクラスEqualsまたはGetHashCodeをオーバーライドしていないので、Unionは重複があることを知っている(ここでは動作しません参照の等価を除く)方法はありません。これらのメソッドを賢明な方法で実装すると、コードが機能します。

これらのリンクは役立つかもしれない:

  • Some info on GetHashCode
  • Guidelines for Equals
    • はまた、あなただけの Unionメソッドに別の引数として IEqualityComparerの独自の実装を渡すことができます。

    0

    Menuクラスは、2つのエントリが同じかどうかを判断するために、IEquatable<>を適切に実装する必要があります。それ以外の場合はUnionはデフォルトの等価を使用し、参照の等価性を比較します。

    0

    あなたは連合のための等値比較子を提供する場合

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


    の更新を参照してください。マージすることができますし、ちょうどあなたのリストをCONCATない - もう一度あなたの質問を読んで、私はあなたの場合は思ったんだけどまた、子メニュー項目もマージする必要があります。この場合、Linq Union演算子を使ってネストしたマージを行う方法はないと思います。