Sembra che si desidera tutto in array2
tranne cosa c'è in array1
:
var onlyInArray2 = array2.Except(array1);
Naturalmente, se si anche voluto sapere che cosa era solo in array1
si potrebbe usare:
var onlyInArray1 = array1.Except(array2);
(Tutto ciò richiede .NET 3.5 o versione successiva o un'implementazione LINQ to Objects alternativa come LINQBridge.)
Suppongo che l'ordine non sia importante quando si calcolano le differenze - Except
è un operatore basato su set, quindi si presuppone che si tratti di collezioni come insiemi.
Nota che Except
restituisce solo un IEnumerable<T>
- se si desidera che i risultati come array, è necessario chiamare ToArray
:
var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();
Se si desidera che la differenza simmetrica, cioè vi interessa soltanto che i valori sono in un singolo array, invece di che serie sono venuti, è possibile utilizzare:
var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));
o si potrebbe usare HashSet
direttamente:
In tutti questi, l'ordine risultante non è definito, sebbene nella pratica Except
manterrà l'ordine originale del primo argomento. Anche se questo è strettamente un dettaglio di implementazione, penso che sia molto improbabile che cambi.
Come gli altri operatori set a base di LINQ, Except
torneranno solo una volta ogni elemento - quindi se COM8
apparso due volte in array2
, sembrerebbe solo una volta nel risultato.
sarebbe davvero aiutare se dovessi dare più dettagli sul confronto che vuoi fare. Ad esempio, consideri importante l'ordine? Astuccio? Che dire se un elemento si verifica in 'com1' ma non in' com2'? –