如何从两个列表中删除重复项,除了少数可能重复的元素
本文关键字:元素 两个 列表 删除 | 更新日期: 2023-09-27 18:26:40
我有两个列表,它们几乎没有共同的元素,我想删除重复的事件,除了下面描述的几个。。并且字符串的顺序必须相同,并且两个列表可能不包含相同数量的元素?
list A: List B
ASCB ASCB
test1 test1
test2 test5
test3 test3
test4 test6
Arinc Arinc
testA testC
testB testB
testC
tesctD
现在我想删除两个列表中除了元素ASCB、ARINC之外的所有常见元素。。如何做到这一点任何人都能帮助我。。。
我只需要将特殊值(ASCB、ARINC等)存储在它们自己的列表中,这样我就可以使用Except
来获得两个集合之间的差异。之后可以在中添加特殊值。
List<string> except = ListA.Except(ListB).Concat(listB.Except(ListA)).Concat(SpecialValues).ToList();
您必须调用except两次,因为首先我们在A中获得不在B中的项。然后我们添加在B中但不在A中的项,最后我们添加特殊值(我假设SpecialValues是一个包含不希望删除的字符串的集合)。
您必须测试性能,因为我怀疑它不是最有效的。
List<string> wordstoKeep = new List<string>() { "ASCB", "Arinc" };
foreach (string str in listB)
{
int index = listA.FindIndex(x => x.Equals(str, StringComparison.OrdinalIgnoreCase));
if (index >= 0)
{
if (!wordstoKeep.Any(x => x.Equals(str, StringComparison.OrdinalIgnoreCase)))
listA.RemoveAt(index);
}
else
listA.Add(str);
}
var listA = new List<string>{"ASCB","test1","test2"};
var listB = new List<string>{"ASCB","test1","test2"};
var combinedList = listA.Where(a => a.Contains("test"))
.Concat(listB.Where(b => b.Contains("test")))
.Distinct().Dump();
输出"test1"、"test2"
您的筛选条件包含在Where
子句中Where
可以是您想要筛选的任何条件:Where(a => a != "ASCB"
或其他什么。。。
Concat
加入了这两个列表。然后调用Distinct()
以获取唯一的条目。
取消订单必须是相同的要求
if(B.Count != A.Count)
return;
List<String> reserved = new List<string>{ "ARCB", "ARINC" };
for (int i = A.Count -1; i >= 0; i--)
{
if (!reserved.Contains(A[i].ToUpper()) && A[i] == B[i])
{
A.RemoveAt(i);
B.RemoveAt(i);
}
}
这是有效的:
var listA = new List<string>()
{
"ASCB",
"test1",
"test2",
"test3",
"test4",
"Arinc",
"testA",
"testB"
};
var listB = new List<string>()
{
"ASCB",
"test1",
"test5",
"test3",
"test6",
"Arinc",
"testC",
"testB"
};
var dontRemoveThese = new List<string>(){"ASCB", "Arinc"};
var listToRemove = new List<string>();
foreach (var str in listA)
if (listB.Contains(str))
listToRemove.Add(str);
foreach (var str in listToRemove){
if (dontRemoveThese.contains(str))
continue;
listA.Remove(str);
listB.Remove(str);
}
我喜欢这个解决方案,因为你可以看到会发生什么。我宁愿有10行代码,其中发生的事情是显而易见的,而不是1-3行晦涩的魔术。