C# 从属性Id包含在另一个列表中的列表中删除值的最佳方法
从属性Id包含在另一个列表中的列表中删除值的最佳方法是什么 我试过了,但没有达到预期效果C# 从属性Id包含在另一个列表中的列表中删除值的最佳方法,c#,list,generics,C#,List,Generics,从属性Id包含在另一个列表中的列表中删除值的最佳方法是什么 我试过了,但没有达到预期效果 internal static List<DashboardData> CloseWhereOpen(List<DashboardData> rawData, List<DashboardData> activitiesOpen) { var index = 0
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;
}
您正在从新创建的列表中删除: 快速解决方法可以是:
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、RemoveAnge方法之一- 我不确定我是否正确理解了你的问题,但这应该可以解决问题:
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}您可以获取需要删除的画布ID,并将其从rawData列表中筛选出来,然后删除整个范围。i、 e
var canvasIds = activitiesOpen.Select(x => x.CanvasId).ToList();
var rawDataItemsToDelete = rawData.Where(x => canvasIds.Contains(x.CanvasId)).ToList();
rawData.RemoveRange(rawDataItemsToDelete);
ToList创建一个新列表,您要从现有列表中删除该列表
我建议您使用LINQ查询:
rawData = rawData
.Where(d => !activitiesOpen.Any(ao => ao.CanvasId == d.CanvasId))
.ToList();
你期待什么?rawData.ToList.removatendex;将创建rawData的副本,从该副本中删除项,然后将其丢弃。只需阅读数百个问题中的一个,这些问题询问如何在枚举时从列表中删除项目。例如:rawData.Reverse.ToList中的foreach var val,然后是later rawData.RemoveAtindex;或者:activitiesOpen.ForEachao=>rawData.RemoveAllx=>x.CanvasId==ao.CanvasId认为这样可读性更好,但确定这也是一个选项:
rawData = rawData
.Where(d => !activitiesOpen.Any(ao => ao.CanvasId == d.CanvasId))
.ToList();