如何获得 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 个字符串数组之间的第一个匹配项的主要内容,如果未能解决你的问题,请参考以下文章