如何从两个列表中删除重复项,除了少数可能重复的元素

本文关键字:元素 两个 列表 删除 | 更新日期: 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行晦涩的魔术。