首页 > 解决方案 > 从列表中删除对象字符串属性不在另一个列表中的对象的财产

问题描述

所以我有两个清单

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]);
        }

标签: c#

解决方案


You can change the logic here, instead of removing items from original list, you can create the new list that will contain only valid items.

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

    }
}


I made this example simple to depict the logic here. Keep in mind that for bigger lists, it would be better to convert listB to Dictionary so then you will be able to get the presence of any key with O(1) complexity.


推荐阅读