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

时间:2013-08-05 18:18:01

标签: c#

我有两个共同的元素很少的列表,我想删除重复事件,除了少数,如下所述..字符串的顺序必须相同,两个列表可能不包含相同的元素?

  list A:                        List B
  ASCB                           ASCB
  test1                          test1
  test2                          test5
  test3                          test3
  test4                          test6
  Arinc                          Arinc
  testA                          testC
  testB                          testB
  testC
  tesctD

现在我想删除两个列表中的所有常见元素,除了元素ASCB,ARINC ..如何做到这一点可以帮助我...

5 个答案:

答案 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);
     }
 }