如何在 C# 中获取两个字符串数组之间的差异

本文关键字:数组 字符串 两个 之间 获取 | 更新日期: 2023-09-27 18:37:02

如何使用C#.net比较两个数组字符串?例如:

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

这里 com1 和 com2 是数组字符串。结果:COM8.如何实现这一点?

如何在 C# 中获取两个字符串数组之间的差异

听起来你想要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 只会返回任何元素一次 - 因此,如果COM8array2 中出现两次,则它只会在结果中出现一次。

使用 linq except 扩展:

IEnumerable<string> result = com2.Except(com1); 
// result: { "COM8" }
你可以

使用IEnumerable.Except。

我认为这是解决这个问题的最短方法

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

如果你想要一个列表中的所有内容,而不是两个列表,在一个表达式中,你可以使用 UnionIntersect Except

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

正如其他人已经说过的那样,Except扩展方法绝对是这里要走的路。但是,我要补充一点,看起来您可能希望对比较方式进行一些控制;如果"COM8"引用串行端口标识符,则需要执行不区分大小写的比较:

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