2016-10-28 5 views
0

Я борется с созданием подсписного объекта с Linq.Выберите дополнительный список <T> с условием фильтрации Список <int> с помощью Linq

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

То, что я хочу сделать сейчас, это удалить назначенные объекты из myObjects с Linq .Where(Func<T,bool> predicate).

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() 

Это работает?

1

Вы можете переписать All() с условием, как это:

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

Однако проще использовать Contains:

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

Использование HashSet<int> ускоряет поиск в ситуациях, когда assignedObject является относительно большие - скажем, сотни объектов и более.

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()

Смежные вопросы