我有两个共同的元素很少的列表,我想删除重复事件,除了少数,如下所述..字符串的顺序必须相同,两个列表可能不包含相同的元素?
list A: List B
ASCB ASCB
test1 test1
test2 test5
test3 test3
test4 test6
Arinc Arinc
testA testC
testB testB
testC
tesctD
现在我想删除两个列表中的所有常见元素,除了元素ASCB,ARINC ..如何做到这一点可以帮助我...
答案 0 :(得分:1)
我只是将特殊值(ASCB,ARINC,ect)存储在它们自己的列表中,这样我就可以使用Except
来获取两组之间的差异。您可以在之后添加特殊值。
List<string> except = ListA.Except(ListB).Concat(listB.Except(ListA)).Concat(SpecialValues).ToList();
你必须两次打电话,因为首先我们得到A中不在B中的项目。然后我们添加B中但不在A中的项目。最后我们添加特殊值(我假设SpecialValues是一个集合用你不想删除的字符串。)
答案 1 :(得分:0)
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()
以获取唯一条目。
答案 2 :(得分:0)
这有效:
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行晦涩的魔法。
答案 3 :(得分:0)
你必须测试性能,因为我怀疑它不是最有效的。
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);
}
答案 4 :(得分:0)
要求订单必须相同
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);
}
}