0

假设我有以下 2 个数组...

string[] A = ["word1", "word2", "word3"];
string[] B = ["word0", "word1", "word2", "word3", "word4", "word5", "word6", "word1", "word2", "word3"];

如果我想将 A 与 B 进行比较并删除 B 中的第一个匹配项,那么它看起来像这样......

string[] B = ["word0", " ", " ", " ", "word4", "word5", "word6", "word1", "word2", "word3"];

我该怎么办?

4

3 回答 3

2

一种直接的方法是使用从in 中Array.IndexOf查找每个单词的第一次出现:AB

foreach (var word in A)
{
    var index = Array.IndexOf(B, word);
    if (index >= 0) {
        B[index] = " "; // or whatever other value
    }
}

请注意,如果替换值本身存在于内部,这可能无法按预期工作A——如果可能的话,您应该指定您想要发生的事情。

更新:看起来您想在内部查找和替换A 整个B子序列,而不是单个元素。这是一个非常不同的问题。一个(天真的)实现是:

var start = Enumerable.Range(0, B.Length - A.Length + 1)
                      .Where(i => B.Skip(i).Take(A.Length).SequenceEqual(A))
                      .DefaultIfEmpty(-1)
                      .First();

if (start != -1)
{
    for (var i = 0; i < A.Length; ++i)
    {
        B[start + i] = " ";
    }
}
于 2013-08-12T19:09:04.227 回答
1

我完全支持@Jon 给出的答案。它非常快速、简洁和精确。我仍然有一种完全不同的方法,一种更实用的方法,以防万一string[]你真的想说一些更流畅的东西:

假设您有一个可能无限的字符串序列,而不是 B 角色的原始数组。它可以是任何东西:直接从数据库读取实体,单子字符串生成器,任何东西:

string[] A = ["word1", "word2", "word3"];
IEnumerable[] B = ...;

您可以为自己编写一个不错的小扩展方法:

public static class MyHelpers {
    public static IEnumerable<string> ReplaceFirstOccurrencesWithEmpty(this IEnumerable<string> @this, IEnumerable<string> a) {

        // prepare a HashSet<string> to know how many A elements there still exist
        var set = new Hashset<string>(a);

        // iterate and apply the rule you asked about
        // virtually forever (if needed)
        foreach (var value in @this) {
            if (set.Remove(value))
                yield return "";
            else
                yield return value;
        }

    }
}

然后你可以像这样使用它,即使在你最初的 A 和 B 数组上:

string[] A = ["word1", "word2", "word3"];
string[] B = ["word0", "word1", "word2", "word3", "word4", "word5", "word6", "word1", "word2", "word3"];

var cQuery = B.ReplaceFirstOccurrencesWithEmpty(A);
string[] c = cQuery.ToArray();
于 2013-08-12T19:21:08.960 回答
0

使用 LINQ

string[] A = new string[] { "word1", "word2", "word3" };
string[] B = new string[] { "word0", "word1", "word2", "word3", "word4", "word5", "word6", "word1", "word2", "word3" };
string[] result = B.Select((word, i) => i <= A.Length && i > 0 && A[i-1] == word ? "" : word).ToArray();
于 2013-08-12T19:30:03.247 回答