根据另一个列表从两个列表中删除元素
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);
}
}
也许 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
中删除一个元素,则相应的元素也应该从List1
中删除List2
) 表明 Dictionary
可能是合适的。 (但这只是一个建议。如果 Dictionary
不起作用,我会使用 Dzienny 简单有效的基于循环的解决方案。)
我有三个列表。 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);
}
}
也许 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
中删除一个元素,则相应的元素也应该从List1
中删除List2
) 表明 Dictionary
可能是合适的。 (但这只是一个建议。如果 Dictionary
不起作用,我会使用 Dzienny 简单有效的基于循环的解决方案。)