如何使用 C#.net 比较两个数组字符串?例如:
string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };
这里 com1 和 com2 是数组字符串。结果:COM8。如何做到这一点?
听起来你想要除了里面的东西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);
在所有这些中,结果顺序是未定义的,尽管在实践Except
中将保留第一个参数的原始顺序。虽然严格来说这是一个实现细节,但我认为它不太可能改变。
与 LINQ 中的其他基于集合的运算符一样,它Except
只会返回任何元素一次 - 所以如果COM8
在 中出现两次array2
,它只会在结果中出现一次。
使用 Linq除外扩展:
IEnumerable<string> result = com2.Except(com1);
// result: { "COM8" }
您可以使用IEnumerable.Except。
我认为这是解决这个问题的最短方法
foreach (string com in com2 )
{
if (!com1.Contains(com))
{
MessageBox.Show(com);
}
}
正如其他人已经说过的那样,Except
扩展方法绝对是要走的路。但是,我要补充一点,看起来您可能希望对比较的方式进行一些控制;如果“COM8”指的是串行端口标识符,那么您需要执行不区分大小写的比较:
var result = com2.Except(com1, StringComparer.OrdinalIgnoreCase);