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

Posted

技术标签:

【中文标题】如何在 C# 中获取两个字符串数组之间的差异?【英文标题】:How do I get the differences between two string arrays in C#? 【发布时间】:2012-06-15 00:40:13 【问题描述】:

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

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

这里 com1 和 com2 是数组字符串。 结果: 通讯8。 如何做到这一点?

【问题讨论】:

如果您能提供有关您想要进行的比较的更多细节,这将非常有帮助。例如,您认为顺序重要吗?案子?如果一个元素出现在com1 而不是com2 怎么办? 【参考方案1】:

听起来你想要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 中出现两次,则它只会在结果中出现一次。

【讨论】:

乔恩陛下,添加了更多内容 ;-) 我认为,如果您在这里得到更好的答案,您可以再写一本书……我一定会买的!【参考方案2】:

使用 Linq Except extension:

IEnumerable<string> result = com2.Except(com1); 
// result:  "COM8" 

【讨论】:

建议:将result 更改为except(或其他方式)【参考方案3】:

你可以使用IEnumerable.Except。

【讨论】:

【参考方案4】:

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

foreach (string com in com2 )

    if (!com1.Contains(com))
    
        MessageBox.Show(com);
    

【讨论】:

【参考方案5】:

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

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

【讨论】:

+,那个很聪明!【参考方案6】:

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

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

【讨论】:

以上是关于如何在 C# 中获取两个字符串数组之间的差异?的主要内容,如果未能解决你的问题,请参考以下文章

两个数据点之间的 Grafana 差异

如何计算bigquery中两个字符串的字母差异?

如何计算 C# 中两个字符串之间的相似度?

c# 如何取两个符号之间的字符串? [关闭]

C#:如何查找两个字符串数组是不是包含相同的值

Kotlin:获取两个日期之间的差异(现在和以前的日期)