-3

共通する要素がほとんどない 2 つのリストがあり、以下に説明するいくつかを除いて重複イベントを削除したい..文字列の順序は同じでなければならず、両方のリストに同じ数の要素が含まれていない可能性がありますか?

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

今、要素ASCB、ARINCを除く2つのリストのすべての共通要素を削除したい..それを行う方法は誰でも私を助けることができます...

4

5 に答える 5

1

特別な値 (ASCB、ARINC、ect) を独自のリストに格納するだけExceptで、2 つのセットの違いを取得するために使用できます。後で特別な値を追加できます。

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

最初に B にはない A の項目を取得するため、except を 2 回呼び出す必要があります。次に、B にあるが A にはない項目を追加します。最後に、特別な値を追加します (SpecialValues は文字列を持つコレクションであると想定しています)削除したくない)。

于 2013-08-05T18:26:06.357 に答える
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);
}

何が起こるかを見ることができるので、私はこの解決策が好きです。1 ~ 3 行のあいまいな魔法よりも、何が起こるかが明らかな 10 行のコードを使用したいと考えています。

于 2013-08-05T18:27:55.197 に答える
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 に答える
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"または何でも...

Concat2 つのリストを結合します。Distinct()次に、一意のエントリを取得するために呼び出します。

于 2013-08-05T18:24:38.340 に答える