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

23 .net c# linq arrays

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

string[] com1 = { "COM6", "COM7" };
string[] com2 = { "COM6", "COM7","COM8" };
Run Code Online (Sandbox Code Playgroud)

这里com1和com2是Array字符串.结果:COM8.怎么做到这一点?

Jon*_*eet 53

听起来像是你想要的一切array2 ,除了什么在array1:

var onlyInArray2 = array2.Except(array1);
Run Code Online (Sandbox Code Playgroud)

当然,如果你想知道只有在什么是array1你可以使用:

var onlyInArray1 = array1.Except(array2);
Run Code Online (Sandbox Code Playgroud)

(这都需要.NET 3.5或更高版本,或LINQBridge等替代LINQ to Objects实现.)

我假设计算差异时顺序并不重要 - Except是一个基于集合的运算符,所以假设您将集合视为集合.

请注意,Except只返回IEnumerable<T>- 如果您希望结果为数组,则需要调用ToArray:

var onlyInArray2 = array2.Except(array1).ToArray();
var onlyInArray1 = array1.Except(array2).ToArray();
Run Code Online (Sandbox Code Playgroud)

如果你想要对称差异,即你只关心单个数组中的哪个值,而不是它们来自哪个数组,你可以使用:

var onlyInOneArray = array1.Union(array2).Except(array1.Intersect(array2));
Run Code Online (Sandbox Code Playgroud)

或者你可以HashSet直接使用:

var set = new HashSet<string>(array1);
// This modifies the set...
set.SymmetricExceptWith(array2);
Run Code Online (Sandbox Code Playgroud)

在所有这些中,生成的顺序是未定义的,但实际上Except将保留第一个参数的原始顺序.虽然这严格来说是一个实现细节,但我认为它不太可能改变.

与LINQ中的其他基于集合的运算符一样,Except只返回任何一个元素 - 因此如果COM8出现两次array2,它只会在结果中出现一次.

  • 我认为你在这里有更好的答案,你可以写另一本书......我肯定会买它! (2认同)

McG*_*gle 18

使用Linq Except扩展:

IEnumerable<string> result = com2.Except(com1); 
// result: { "COM8" }
Run Code Online (Sandbox Code Playgroud)


Ven*_*kov 10

您可以使用IEnumerable.Except.


Gau*_*wal 7

我认为这是解决这个问题的最短途径

foreach (string com in com2 )
{
    if (!com1.Contains(com))
    {
        MessageBox.Show(com);
    }
}
Run Code Online (Sandbox Code Playgroud)