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

时间:2018-04-06 13:21:10

标签: c# list generics

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

4 个答案:

答案 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;
}

或者,只需使用上述RemoveAllRemoveRange方法之一; - )

答案 3 :(得分:1)

ToList创建一个新列表,您要从现有列表中删除。

我建议这个LINQ查询:

rawData = rawData
    .Where(d => !activitiesOpen.Any(ao => ao.CanvasId == d.CanvasId))
    .ToList();