我有三个清单。 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
中删除我想要的元素。
有什么想法吗?
答案 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)
如果要与List1
和List2
相关联,可以将它们组合成Dictionary<string, int>
吗?然后从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));
让List1
和List2
如此紧密相连(两个列表都有相同数量的元素;如果从List1
删除了一个元素,那么应该从{{}中删除相应的元素1}})表明List2
可能是合适的。 (但这只是一个建议。如果Dictionary
不起作用,我会使用Dzienny简单有效的基于循环的解决方案。)