0

我想删除两个给定字符串之间匹配的字符。例如。

string str1 = "Abbbccd";
string str2 = "Ebbd";

从这两个字符串中,我希望输出为:

"Abcc",只有那些存在于 str2 中的匹配字符应该从 str1 中删除。

我尝试了以下代码:

   public string Sub(string str1, string str2)
   {
       char[] arr1 = str1.ToCharArray();
       char[] arr2 = str2.ToCharArray();

       char[] arrDifference = arr1.Except(arr2).ToArray();
       string final = new string(arrDifference);

       return final;
   }

使用此代码,我得到的输出为"Ac". 它删除两个数组之间的所有匹配字符,并且只存储一次“c”。

4

3 回答 3

3

首先创建这个辅助方法:

IEnumerable<Tuple<char, int>> IndexDistinct(IEnumerable<char> source)
{
    var D = new Dictionary<char, int>();
    foreach (var c in source)
    {
        D[c] = D.ContainsKey(c) ? (D[c] + 1) : 0;
        yield return Tuple.Create(c, D[c]);
    }
}

它将字符串 "aabcccd" 转换为 [(a,0),(a,1),(b,0),(c,0),(c,1),(c,2),(d,0) ]。这个想法是通过在相等的字符上添加一个计数索引来使每个字符都不同。

然后像这样修改您建议的功能:

string Sub(string str1, string str2)
{
    return new string(
        IndexDistinct(str1)
            .Except(IndexDistinct(str2))
            .Select(x => x.Item1)
            .ToArray());
}

现在您正在执行ExceptonTuple<char, int>而不是 just char,您应该得到您指定的行为。

于 2013-07-15T23:25:28.647 回答
3

您也可以使用列表来执行此操作:

    List<char> one = new List<char>("Abbbccd".ToCharArray());
    List<char> two =  new List<char>("Ebbd".ToCharArray());
    foreach (char c in two) {
        try { one.RemoveAt(one.IndexOf(c)); } catch { }
    }
    string result = new string(one.ToArray());
于 2013-07-16T00:07:45.707 回答
0

使用 C# 的字符串命令来修改字符串。

    public string testmethod(string str1, string str2)
    {
        string result = str1;
        foreach (char character in str2.ToCharArray())
        {
            result = result.Replace(character.ToString(), "");
        }

        return result;
    }
于 2013-07-15T23:58:33.593 回答