2016-10-28 2 views
0

私はLinqでオブジェクトのサブリストを作成するのに苦労しています。私は今、何をしたいかサブリストを選択フィルタリング条件リスト<int> Linqを使用

var assignedObject = new List<int>(); 
foreach (var obj in myObjects) { 
    if (IsAssigned(obj)) { 
     assignedObject.add(obj.Id); 
    } 
} 

は、LINQの.Where(Func<T,bool> predicate)myObjectsから割り当てられたオブジェクトを削除しています。

myObjects = myObject.Where(item => item.Id != assignedObj.All()).ToList(); 

item.Id != assignedObj.All()が問題の部分です。

Linqで実現可能であれば、私に教えてください。

それ以外の場合は、ループを実装します。

var remainingObjects = new List<MyClass>(); 
foreach(var obj in myObjects) { 
    if (!(assignedObjects.IndexOf(obj.Id) > -1)) { 
     remainingObjects.Add(obj); 
    } 
} 

PS:ケースであなたはどこか別の場所から取得List<MyClass> myObjects = GetMyObjects(params);を迷っています。

+1

を試してみて、あなただけの ''項目=> assignedObj.Contains(item.id)をお探しですか?現時点ではそれほど明確ではありません。あなたが[mcve]を投稿することができれば、あなたを助けやすくなります。 –

+0

@JonSkeetなぜ私はそれを考えなかったのですか? – iiminov

答えて

1
var toRemove = myObjects.Where(item=>assignedObj.Any(a=>a.Id == item.Id)).ToArray() 

これは機能しますか? assignedObjectがあるときの状況でのルックアップをHashSet<int>スピードアップ使用

var assignedIds = new HashSet<int>(assignedObject); 
myObjects = myObject.Where(item => assignedIds.Contains(item.Id)).ToList(); 

myObjects = myObject 
    .Where(item => assignedObj.All(assigned => item.Id != assigned.Id)) 
    .ToList(); 

しかし、Containsを使用する方が簡単です:

1

あなたはこのように、条件を使用してAll()を書き換えることができます比較的大きい - 例えば何百ものオブジェクト。

1

それはこのようになりますvar list = from item in myObjects where IsAssigned(item) select item

1

この
var assignedObjects = myObjects.Where(m => IsAssigned(m)).ToList()
var remainedObjects = myObjects.Where(m => !IsAssigned(m)).ToList()

関連する問題