如何获得 2 个字符串数组之间的第一个匹配项

Posted

技术标签:

【中文标题】如何获得 2 个字符串数组之间的第一个匹配项【英文标题】:How to get the 1st match between 2 string arrays 【发布时间】:2013-05-07 23:57:39 【问题描述】:

我有 2 个字符串数组。一是基础,二是变化。

string[] baseArray =  "Gold", "Silver", "Bronze" ;
string[] readArray =  "Bronze", "Silver", "Gold" ;

// After comparing the readArray over the baseArray the result should be this
//string match = "Gold";

我想按baseArray的顺序排在第一位。

//Example2
string[] readArray =  "Bronze", "Silver" ;
//string match should be "Silver"

【问题讨论】:

【参考方案1】:

如果你只想要一个结果,使用 LINQ:

string firstMatch = baseArray.FirstOrDefault(readArray.Contains);

如果你只想要一个结果,而不是使用 LINQ:

string firstMatch = null;
foreach(string element in baseArray)

    if (Array.IndexOf(readArray, element) >= 0)
    
        firstMatch = element;
        break;
    

如果你想要所有匹配的元素,使用 LINQ:

string[] common = baseArray.Intersect(readArray).ToArray();

如果你想要所有匹配的元素,而不是使用 LINQ:

HasSet<string> common = new HashSet<string>(readArray);
result.Intersect(baseArray);

【讨论】:

+1 比我的解决方案更好。不过,我最后会做一个FirstOrDefault() 他想要第一场比赛不是全部。 我想要 baseArray 中的第一个按顺序排列的字符串,尽管我会试一试。 @MartinMulder:因为Intersect 是高效的并且是通过使用延迟执行来实现的,所以我会将它与FirstOrDefault 一起使用。所以:baseArray.Intersect(readArray).FirstOrDefault(). @Tim:有趣的想法。我想衡量这两种解决方案的性能,但不是今晚。我现在要睡觉了! :)【参考方案2】:
var match = baseArray.FirstOrDefault(x => readArray.Contains(x));

【讨论】:

contains 可能会给出错误的结果,也许我可以使用 equals。 @Incognito .Contains() 在幕后使用 .Equals()。如果一个失败了,那么两个都是。 @Incognito。为什么会失败?因为文化? 我的意思是在我的情况下,因为 sting 数组并不完全是它的一个例子。例如 readArray 可以包含“Gold-Word”“Gold-Word2”等,它会失败我想检查它是数组的确切索引。 @Incognito 我使用.Contains() 来查找列表中的项目,而不是使用string.Contains() 来查找字符串是否包含另一个字符串。这与它无关。

以上是关于如何获得 2 个字符串数组之间的第一个匹配项的主要内容,如果未能解决你的问题,请参考以下文章

如何在其他python 3中找到与最后n个字符串匹配的第一个n个字符串之间的重叠?

替换文件中的第 N 个字符串匹配项

c语言中如何获得字符串的第n个字符?

C#判断某个字符串是否在另一个字符串数组中

如何在分隔字符串的第一个元素上找到部分重复项?

如何使用正则表达式查找特定匹配项并将它们放入字符串数组中?