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

3
我有三个列表。List1包含一些字符串,List2包含一些数字(在我这里是uint,尽管这不是非常重要),并且它总是具有与第一个列表完全相同的元素数。 List3始终具有较少的元素,并且还包含一些字符串。请注意,List1包含所有List3所具有的元素(以及更多字符串)。
我想做的是从List1中删除所有包含在List3中的元素。但是,我还希望以这种方式从List2中删除元素:如果(例如),必须删除第5个元素,则必须删除List2中的第5个元素。如果必须删除第12个元素,则必须删除List2中的第12个元素,依此类推。
我可以使用以下代码从List1中删除元素:List1.RemoveAll(x => List3.Contains(x))。但是,我不太熟悉RemoveAll方法,也不确定如何按照我描述的方式从List2中删除所需的元素。
任何想法?

1
看一下 List1.Except() 函数。 - MethodMan
2
循环遍历list3,检查list1是否包含它。然后获取索引并使用索引号从list1和list2中删除它。 - deathismyfriend
听起来基于数组的算法更适合您的需求。您需要进行线性操作,而不是二次操作。 - code4life
3个回答

4
您可以倒序遍历列表,因为这样您就可以从列表末尾删除元素,例如:
for (var i = list1.Count - 1; i >= 0; i--)
{
    if (list3.Contains(list1[i]))
    {
        list1.RemoveAt(i);
        list2.RemoveAt(i);
    }
}

太简单了,我在想为什么我想不到这个主意!谢谢! - OC_

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

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

1
FindIndex 仅返回第一个匹配项的索引。如果有重复项,则会忽略它们。 - Dzienny

1
也许如果List1和List2是相关的,它们可以合并为Dictionary?然后从List1和List2中删除数据就相当于删除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中删除一个元素,则应从List2中删除相应的元素)表明使用Dictionary可能是合适的。(但这只是一个建议。如果Dictionary不起作用,我将使用Dzienny的简单有效的基于循环的解决方案。)

我最终使用了Dzienny的解决方案。不过,我非常喜欢这个想法,所以我会保存在某个地方。以后可能会用得到。感谢您的时间! - OC_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接