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

时间:2015-07-02 17:32:22

标签: c# list removeall

我有三个清单。 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中删除我想要的元素。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

您可以在列表上向后循环,因为这样您就可以从列表末尾删除元素,例如:

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

答案 1 :(得分: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);
        });

答案 2 :(得分:1)

如果要与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删除了一个元素,那么应该从{{}中删除相应的元素1}})表明List2可能是合适的。 (但这只是一个建议。如果Dictionary不起作用,我会使用Dzienny简单有效的基于循环的解决方案。)