2016-10-24 7 views
0

これは非常に簡単なはずですが、なぜ私のすべてのメソッドが機能していないのか分かりません。あるリストから別のリストにある要素を削除してください

私はすべてのソリューションを見て、適切に使用しましたが、結果が得られません。

ソリューションはここ

Solution 1

Solution 2

が含まれるコードです:

var filteredList = (available.Except(selected)).ToList; 
除き使用
IEnumerable<feature> available = _repo.GetAvailableFeatures(); 
IEnumerable<feature> selected = _repo.GetSelectedFeatures(); 

for (var i = 0; i < availableList.Count - 1; i++) 
     { 
      foreach (var t in selectedList) 
      { 
       if (availableList[i].Id == t.Id) 
       { 
        availableList.RemoveAt(i); 
       } 
      } 
     } 

マイフィーチャークラスの古いファッションを使用してLINQの

var availableList = available.ToList(); 
var selectedList = selected.ToList(); 
availableList.RemoveAll(item => selectedList.Contains(item)); 

を使用して

は次のようになります。

public class Feature 
{ 
public int Id; 
public int Desc; 
} 

誰もがここで私の過ちを見ることができますか?

+0

正確には動作しません。 –

+1

(メモリ内オブジェクトではなくデータベースアクセスを前提としています) 'Feature'は' .Equals'と '.GetHashCode'をオーバーライドしません。すべてのアイテムは一意であるとみなされます。 – Caramiriel

+0

'Feature'クラスで' Equal'と 'GetHashCode'をオーバーライドするか、カスタム等価比較子を使って' Except'を使う必要があります。 –

答えて

3

Exceptを使用するときは、featureタイプの「等しい」とは何かを定義する必要があります。そうでない場合は、参照の等価性(同じオブジェクトですか)がデフォルトで使用されます。

  • オーバーライドfeatureクラスのEqualsGetHashCode
    • これは、平等の「デフォルト」の定義になり:「Id sが同じである」として、あなたのループでは、そのいくつかのオプションがあり、「等しい」を定義しますタイプ
  • IEqualityComparer<feature>
    • Tを実装するクラスを定義します。その定義は
  • 利用Whereの代わりExcept必要になったとき、彼にのみ使用することができます

    var filteredList = available.Where(a => !selected.Any(s => s.Id == a.Id)) 
              .ToList(); 
    
    • パフォーマンスが次善であるが、パフォーマンスが全体的に影響されない場合には、単純なコードソリューションであります有意に。
0

これはお互いに二つのデータのリストを比較し、標準的な方法でそれらを除去する簡単なプロセスのように見えます。私は個人的にIEnumerableの代わりにリストの設定に行きます。

List<Feature> availableList = _repo.GetAvailableFeatures(); 
List<Feature> selectedList = _repo.GetSelectedFeatures(); 
foreach(Feature avail in availableList){ 
    if(selectedList.Contains(avail)){ 
     selectedList.Remove(avail) 
    } 
+0

私はこのソリューションatmを試していないので、答えとしてマークしていません。明日それをテストします – yuvs

+0

残念なことに、さらにそれを見て、それはロジックとのわずかな問題があるようです。 selectListに表示される項目を削除する必要があるavailableListである必要があります。私はそれに応じてコードを変更しましたが、それでも動作しません。 foreach(selectedFeatureListのvar avail) { if(availableFeatureList.Contains(avail)) { availableFeatureList.Remove(avail); } } – yuvs

関連する問題