从对象字符串属性不在另一个list <t>属性中的列表中删除对象

时间:2019-05-31 18:40:08

标签: c#

所以我有两个列表

List<ObjectA>List<ObjectB>

每个列表包含一个字符串属性ItemID

我有一个问题,如果在列表中的任何ObjectA的字符串属性中都找不到列表中的任何ObjectB的字符串属性,然后从列表中删除ObjectA列表。

到目前为止,这是我的代码

List<string> orderedItemIds = new List<string>();
List<string> shippedItemIds = new List<string>();

for (int y = 0; y <= result.Order_Info.Order_Items.Count - 1; y++)
{
    orderedItemIds.Add(result.Order_Info.Order_Items[y].Item_Id);
}

for (int i = 0; i <= result.Order_Info.Shipments.Count-1; i++)
{
    for (int x = 0; x <= result.Order_Info.Shipments[i].Items_Info.Count - 1; x++)
    {
       shippedItemIds.Add(result.Order_Info.Shipments[i].Items_Info[x].Item_Id);
    }
}

现在,即使我能够确定哪个字符串不在另一个列表中,我也要坚持下去,该如何删除该对象?我是否要遍历要从中删除的列表中的每个对象,并检查该字符串是否在列表中,如果要删除,则将其删除?

解决方案: 多亏了这个答案,我才意识到我可以颠倒逻辑,但我想我是有远见的。

        List<string> orderedItemIds = new List<string>();
        List<OrderShipmentModel> shippedItems = new List<OrderShipmentModel>();
        for (int y = 0; y <= result.Order_Info.Order_Items.Count - 1; y++)
        {
            orderedItemIds.Add(result.Order_Info.Order_Items[y].Item_Id);
        }

        for (int i = 0; i <= result.Order_Info.Shipments.Count-1; i++)
        {
            for (int x = 0; x <= result.Order_Info.Shipments[i].Items_Info.Count - 1; x++)
                if(orderedItemIds.Any(item => item == result.Order_Info.Shipments[i].Items_Info[x].Item_Id))
                    shippedItems.Add(result.Order_Info.Shipments[i]);
        }

1 个答案:

答案 0 :(得分:1)

您可以在此处更改逻辑,而不是从原始列表中删除项目,而可以创建仅包含valid个项目的新列表。

class Program
{
    private class MyClass
    {
        public string ItemId { get; set; }
    }
    static void Main(string[] args)
    {
        var listA = new List<MyClass> {
            new MyClass { ItemId = "a"},
            new MyClass { ItemId = "b"},
            new MyClass { ItemId = "c"},
            new MyClass { ItemId = "d"}};

        var listB = new List<MyClass> {
            new MyClass { ItemId = "a"},
            new MyClass { ItemId = "b"},
            new MyClass { ItemId = "x"},
            new MyClass { ItemId = "y"}};

        var listWithValidItemsOnly = new List<MyClass>();

        foreach (var itemA in listA)
        {
            if (listB.Any(item => item.ItemId == itemA.ItemId))
                listWithValidItemsOnly.Add(itemA);
        }

    }
}


我简化了此示例以在此处描述逻辑。请记住,对于较大的列表,将listB转换为Dictionary更好,这样您就可以获取具有O(1)复杂性的任何键。