2012-03-23 5 views
11

[OK]をので、私はC#C#で2つのリストの違いをどのように取得できますか?私が今見て比較する必要が

List<Attribute> attributes = new List<Attribute>(); 
List<string> songs = new List<string>(); 

一つに二つのリストを持っているが、文字列であり、もう一つは、私は、単純な

class Attribute 
{ 
    public string size { get; set; } 
    public string link { get; set; } 
    public string name { get; set; } 
    public Attribute(){} 
    public Attribute(string s, string l, string n) 
    { 
     size = s; 
     link = l; 
     name = n; 
    } 
} 

をcreated..very属性オブジェクトであります彼らは、属性リストのnに含まれていないので、私は「他」と「また別の」返す方法をしたい

songs.Add("something"); 
songs.Add("another"); 
songs.Add("yet another"); 

Attribute a = new Attribute("500", "http://google.com", "something"); 
attributes.Add(a); 

例えばので、属性名にはどのような曲ではありませんこれは、すべての曲を見つけるための方法であることリスト

答えて

33
var difference = songs.Except(attributes.Select(s=>s.name)).ToList(); 

編集

追加ToListメソッド()のためのAME

ので、属性名には含まれません。

var result = songs 
    .Where(!attributes.Select(a => a.name).ToList().Contains(song)); 

Exceptを使用した回答も完璧で、おそらく効率的です。

EDIT:LINQ to SQLで使用している場合、このsintaxは利点があります:NOT IN SQL述語に変換されます。 ExceptはSQLのものに変換されません。したがって、そのコンテキストでは、すべてのレコードはデータベースから回復され、アプリ側では除外されますが、これははるかに効率が悪いことです。

+0

意志の差はリスト – Trace

+1

ことがありません、IEnumerableをするが、列挙ToListメソッド() –

+0

を呼び出します。必要ならToList()を使います。 –

4
var diff = songs.Except(attributes.Select(a => a.name)).ToList(); 
4

作るための擬似コード

difference = songs - attributes.names 
+0

「例外」を使用する他の回答が完璧で効率的な場合は、なぜこれを投稿しましたか? –

+0

あなたがそれを見ると、私はこれを他の答えの前に掲載し、後でコメントを追加して、他の解決策が優れていることを明示しました。 – JotaBe

+1

"私はこれを他の回答の前に掲載しました。"あなたはしませんでした。 –

6

それはここに掲載答えはattributes.namesに存在しないsongsのリストを返しますが、それはあなたのsongsに存在しないattributes.namesのリストを与えないことを指摘する価値があります。

これはOPが望んだものですが、タイトルが少し誤解を招く場合があります。特に、(私のように)ここに来て2つのリストの内容が異なるかどうかを確認する方法を探しているとします。これはあなたが望むものである場合は、次のように使用することができます: -

var differences = new HashSet(songs); 
differences.SymmetricExceptWith(attributes.Select(a => a.name)); 
if (differences.Any()) 
{ 
    // The lists differ. 
} 
関連する問題