根据另一个列表从两个列表中删除元素

Remove elements from two lists based on another list

我有三个列表。 List1 包含一些字符串。 List2 包含一些数字(在我的例子中是 uint,尽管这不是很重要)并且它始终具有与第一个元素完全相同的元素数。 List3 总是有较少的元素,它也有一些字符串。请注意 List1 包含 List3 具有的所有元素(以及更多字符串)。

我想要做的是删除 List1 中包含在 List3 中的所有元素。但是,我也想以这种方式从 List2 中删除元素:如果(例如)必须删除 List1 的第 5 个元素,则必须从 List2 中删除第 5 个元素删除。如果必须删除 List1 的第 12 个元素,则必须删除 List2 的第 12 个元素,依此类推。

我可以使用以下代码从 List1 中删除元素:List1.RemoveAll(x => List3.Contains(x))。 但是,我对 RemoveAll 方法不是很熟悉,我不确定如何按照我描述的方式从 List2 中删除我想要的元素。

有什么想法吗?

如建议的那样,一个简单的循环和索引查找器:

 list3.ForEach(x =>
   {  
      var index = list1.FindIndex(list3.Contains);
      list2.RemoveAt(index);
      list1.RemoveAt(index);
   }

但是如果第一个列表包含重复项:

 var query = list1.Where(list3.Contains).Select((value, index) => new {index}).ToList();
     query.ForEach(x =>
        {
           list2.RemoveAt(x.index);
           list1.RemoveAt(x.index);
        });

你可以向后循环遍历列表,因为这样你就可以从列表的末尾删除元素,例如:

for (var i = list1.Count - 1; i >= 0; i--)
{
    if (list3.Contains(list1[i]))
    {
        list1.RemoveAt(i);
        list2.RemoveAt(i);
    }
}

也许 List1List2 可以组合成一个 Dictionary<string, int> 如果它们是相关的?然后从 List1List2 中删除数据相当于删除 KeyValuePair。但是当然,List1不能有任何重复项,否则字典将有重复键。

如果 Dictionary 在语义上有意义(List1 包含键,List2 包含相应的值),这里是一个实现:

Dictionary<string, uint> dictionary = List1.ToDictionary(key => key, key => List2[List1.IndexOf(key)];
Dictionary<string, uint> result = dictionary.Where(keyValuePair => !List3.Contains(keyValuePair.Key));

如果 List2 应包含键且 List1 应包含值,则可以使用类似的实现:

Dictionary<uint, string> dictionary = List2.ToDictionary(key => key, key => List1[List2.IndexOf(key)];
Dictionary<uint, string> result = dictionary.Where(keyValuePair => !List3.Contains(keyValuePair.Value));

List1List2有如此强的联系(两个列表的元素个数相同;如果从List1中删除一个元素,则相应的元素也应该从List1中删除List2) 表明 Dictionary 可能是合适的。 (但这只是一个建议。如果 Dictionary 不起作用,我会使用 Dzienny 简单有效的基于循环的解决方案。)