-3

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

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

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

4

5 回答 5

1

我只是将特殊值(ASCB、ARINC 等)存储在他们自己的列表中,这样我就可以Except用来获取两组之间的差异。您可以在之后添加特殊值。

List<string> except = ListA.Except(ListB).Concat(listB.Except(ListA)).Concat(SpecialValues).ToList();

您必须调用 except 两次,因为首先我们在 A 中获取不在 B 中的项目。然后我们添加在 B 中但不在 A 中的项目。最后我们添加特殊值(我假设 SpecialValues 是带有字符串的集合你不想删除)。

于 2013-08-05T18:26:06.357 回答
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()以获取唯一条目。

于 2013-08-05T18:24:38.340 回答
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 行晦涩难懂的魔法。

于 2013-08-05T18:27:55.197 回答
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);
}
于 2013-08-05T18:36:15.523 回答
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);
     }
 }
于 2013-08-05T18:45:22.130 回答