所以我有两个列表
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]);
}
答案 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)复杂性的任何键。