Sto provando a fare quello che penso sia un "de-intersect" (non sono sicuro di quale sia il nome corretto, ma è quello che chiamava Tim Sweeney di EpicGames nel vecchio UnrealEd)Modo più rapido per fare una lista <T> .Contains()
// foo and bar have some identical elements (given a case-insensitive match)
List‹string› foo = GetFoo();
List‹string› bar = GetBar();
// remove non matches
foo = foo.Where(x => bar.Contains(x, StringComparer.InvariantCultureIgnoreCase)).ToList();
bar = bar.Where(x => foo.Contains(x, StringComparer.InvariantCultureIgnoreCase)).ToList();
poi in seguito, faccio un'altra cosa in cui mi sottraggo il risultato dall'originale, per vedere quali elementi ho rimosso. È super veloce usando. Eccetto(), quindi non ci sono problemi.
Ci deve essere un modo più veloce per fare questo, perché questo è piuttosto male performante con ~ 30.000 elementi (di stringa) in entrambi gli elenchi. Preferibilmente, un metodo per fare questo passo e quello successivo in un colpo solo sarebbe bello. Ho provato a usare .Exists() invece di .Contains(), ma è leggermente più lento. Mi sento un po 'spessa, ma penso che dovrebbe essere possibile con alcune combinazioni di .Except() e .Intersect() e/o .Union().
Perché lo stai facendo due volte? Non il primo contiene il confronto ti dà tutte le partite? A meno che non lo capisca male. – gcores
Ho bisogno di conservare il caso, che può (e dovrebbe) differire tra i due elenchi. Fondamentalmente, questo è per un programma di confronto di directory automatico che può sincronizzare percorso e nome del file, e ignorare le voci non corrispondenti su entrambi i lati. –