从属性Id包含在另一个列表中的列表中删除值的最佳方法是什么。
我尝试了这个,但并没有按照预期的方式工作。
internal static List<DashboardData> CloseWhereOpen(List<DashboardData> rawData,
List<DashboardData> activitiesOpen)
{
var index = 0;
foreach (var val in rawData)
{
if (activitiesOpen.Select(ao=>ao.CanvasId == val.CanvasId).Count() > 0) {
rawData.ToList().RemoveAt(index);
}
index++;
}
return rawData;
}
答案 0 :(得分:3)
我不确定我是否正确理解了你的问题,但这应该可以解决问题:
foreach (var val in activitiesOpen)
{
rawData.RemoveAll(x => x.CanvasId == val.CanvasId);
}
示例列表(带有简化的整数):
(前)
activitiesOpen = {1,3}
rawData = {1,2,3,4,5}
(后)
rawData = {2,4,5}
答案 1 :(得分:2)
您可以获取需要删除的canvasId并将其从rawData
列表中过滤掉,然后删除整个范围。即。
var canvasIds = activitiesOpen.Select(x => x.CanvasId).ToList();
var rawDataItemsToDelete = rawData.Where(x => canvasIds.Contains(x.CanvasId)).ToList();
rawData.RemoveRange(rawDataItemsToDelete);
答案 2 :(得分:1)
您要从新创建的List
:
//new list //remove it
rawData.ToList().RemoveAt(index);
快速修复可能是:
rawData = rawData.ToList().RemoveAt(index);
但是你正在改变你的收藏。因此,更好的方法是使用倒置for循环:
internal static List<DashboardData> CloseWhereOpen(List<DashboardData> rawData,
List<DashboardData> activitiesOpen)
{
var index = 0;
for (var i = rawData.Length -1; i >= 0; i--)
{
if (activitiesOpen.Select(ao=>ao.CanvasId == rawData[i].CanvasId).Count() > 0)
{
rawData.RemoveAt(index);
}
}
return rawData;
}
或者,只需使用上述RemoveAll
,RemoveRange
方法之一; - )
答案 3 :(得分:1)
ToList
创建一个新列表,您要从现有列表中删除。
我建议这个LINQ查询:
rawData = rawData
.Where(d => !activitiesOpen.Any(ao => ao.CanvasId == d.CanvasId))
.ToList();