Как сравнить две строки массива с помощью С#.net? Например:
string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };
Здесь com1 и com2 - строка Array. Результат: COM8. Как достичь этого?
Как сравнить две строки массива с помощью С#.net? Например:
string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };
Здесь com1 и com2 - строка Array. Результат: COM8. Как достичь этого?
Я думаю, что это самый короткий способ решить этот
foreach (string com in com2 )
{
if (!com1.Contains(com))
{
MessageBox.Show(com);
}
}
Похоже, вы хотите все в 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
, он появится только один раз в результате.
Использование Linq За исключением расширения:
IEnumerable<string> result = com2.Except(com1);
// result: { "COM8" }
Вы можете использовать IEnumerable.Except.
Если вы хотите все, что в одном списке, но не в обоих, в одном выражении, вы можете использовать Union
, Intersect
и Except
:
var inOnlyOneArray = array1.Union(array2).Except(array1.Intersect(array2));
Как уже говорили другие, метод расширения Except
определенно подходит для этого. Однако я добавлю, что похоже, что вам может потребоваться некоторый контроль над тем, как производится сравнение; если "COM8" относится к идентификатору последовательного порта, то вы хотите выполнить сравнение без учета регистра:
var result = com2.Except(com1, StringComparer.OrdinalIgnoreCase);