Подтвердить что ты не робот

Как получить различия между двумя строковыми массивами в С#?

Как сравнить две строки массива с помощью С#.net? Например:

string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };

Здесь com1 и com2 - строка Array. Результат: COM8. Как достичь этого?

4b9b3361

Ответ 1

Я думаю, что это самый короткий способ решить этот

foreach (string com in com2 )
{
    if (!com1.Contains(com))
    {
        MessageBox.Show(com);
    }
}

Ответ 2

Похоже, вы хотите все в array2 кроме того, что в array1:

var onlyInArray2 = array2.Except(array1);

Конечно, если вы также хотели знать, что было только в array1, вы могли бы использовать:

var onlyInArray1 = array1.Except(array2);

(для этого требуется .NET 3.5 или выше или альтернативная реализация LINQ to Objects, такая как LINQBridge.)

Я предполагаю, что порядок не важен при вычислении различий - Except - это оператор на основе набора, поэтому предполагает, что вы рассматриваете коллекции как наборы.

Обратите внимание, что Except просто возвращает IEnumerable<T> - если вы хотите получить результаты как массивы, вам нужно вызвать ToArray:

var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();

Если вам нужна симметричная разница, т.е. вы только заботитесь о том, какие значения находятся в одном массиве, а не о том, из какого массива они пришли, вы можете использовать:

var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));

или вы можете напрямую использовать HashSet:

var set = new HashSet<string>(array1);
// This modifies the set...
set.SymmetricExceptWith(array2);

Во всех этих случаях результирующий порядок равен undefined, хотя на практике Except сохранит исходный порядок первого аргумента. Хотя это, строго говоря, деталь реализации, я думаю, что это вряд ли изменится.

Как и другие операторы на основе набора в LINQ, Except будет возвращать только один элемент один раз, поэтому, если COM8 появился дважды в array2, он появится только один раз в результате.

Ответ 5

Если вы хотите все, что в одном списке, но не в обоих, в одном выражении, вы можете использовать Union, Intersect и Except:

var inOnlyOneArray = array1.Union(array2).Except(array1.Intersect(array2));

Ответ 6

Как уже говорили другие, метод расширения Except определенно подходит для этого. Однако я добавлю, что похоже, что вам может потребоваться некоторый контроль над тем, как производится сравнение; если "COM8" относится к идентификатору последовательного порта, то вы хотите выполнить сравнение без учета регистра:

var result = com2.Except(com1, StringComparer.OrdinalIgnoreCase);