使用Linq选择带有过滤条件List <int>的子List <t>

时间:2016-10-28 13:26:41

标签: c# linq list

我正在努力用Linq生成一个对象子列表。

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

我现在要做的是使用Linq myObjects.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);

4 个答案:

答案 0 :(得分:1)

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

这有用吗?

答案 1 :(得分: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相对较大的情况下(例如,数百个或更多对象)加快查找速度。

答案 2 :(得分:1)

可以是这样的:- (void) scrollViewDidZoom:(UIScrollView *)scrollView { CGFloat newBorderWidth = UIScreen.mainScreen.scale / scrollView.zoomScale; zoomView.layer.borderWidth = newBorderWidth; }

答案 3 :(得分:1)

试试这个 var assignedObjects = myObjects.Where(m => IsAssigned(m)).ToList()
var remainedObjects = myObjects.Where(m => !IsAssigned(m)).ToList()