【问题标题】:How to get the 1st match between 2 string arrays如何获得 2 个字符串数组之间的第一个匹配项
【发布时间】: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"

【问题讨论】:

    标签: c# linq string-matching string-comparison arrays


    【解决方案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() 来查找字符串是否包含另一个字符串。这与它无关。
    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 2023-03-18
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多