Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从属性Id包含在另一个列表中的列表中删除值的最佳方法_C#_List_Generics - Fatal编程技术网

C# 从属性Id包含在另一个列表中的列表中删除值的最佳方法

C# 从属性Id包含在另一个列表中的列表中删除值的最佳方法,c#,list,generics,C#,List,Generics,从属性Id包含在另一个列表中的列表中删除值的最佳方法是什么 我试过了,但没有达到预期效果 internal static List<DashboardData> CloseWhereOpen(List<DashboardData> rawData, List<DashboardData> activitiesOpen) { var index = 0

从属性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;
}

您正在从新创建的列表中删除:

快速解决方法可以是:

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