在c#中基于两个数组查找和替换字符串中的字符

本文关键字:替换 字符串 字符 数组 于两个 查找 | 更新日期: 2023-09-27 18:18:31

我得到了一个包含一些特殊字符的字符串。

string strValue = "MyString[]{"; 

这里字符串strValue包含一些特殊字符,这些字符在字符数组arrFindString中提到,相应的字符需要替换为arrReplaceString中具有相同索引位置的另一个字符数组中的字符。

char[] findArray = {'[',']','{'};
char[] replaceArray = { '(', ')', '-' };

所以在我的情况下,字符串strValue有一个字符叫做'['。首先我们需要在findArray中找到对应字符的索引然后我们需要将该字符替换为在replaceArray中具有相同索引的字符因此这里'['必须替换为'('

是否有同样的方法可以用linq来完成?

在c#中基于两个数组查找和替换字符串中的字符

首先,我宁愿将findArrayreplaceArray合并为单个Dictionary<Char, Char>:

  Dictionary<Char, Char> replaces = new Dictionary<Char, Char>() {
    {'[', '('},
    {']', ')'},
    {'{', '-'},
  };

则可以使用Linq:

  string strValue = "MyString[]{"; 
  String result = new String(strValue
    .Select(c => { 
       Char substitute;
       if (replaces.TryGetValue(c, out substitute))
         return substitute;
       else 
         return c;  
       })
    .ToArray());

作为替代,您可以使用foreach循环:

  StringBuilder sb = new StringBuilder(strValue.Length);
  foreach (var c in strValue) {
    Char substitute;
    if (replaces.TryGetValue(c, out substitute))
      sb.append(substitute);  
    else 
      sb.append(c);   
  }
  String result = sb.ToString();

Linq方法

string strValue = "MyString[]{"; 
char[] findArray = {'[',']','{'};
char[] replaceArray = { '(', ')', '-' };
Func<char, int, char> GetC = (x, c) => c > -1 ? replaceArray.ElementAt(c) : x;
string Result = string.Concat(strValue.Select(x => GetC(x, Array.IndexOf(findArray, x))));

这是最优的方式。这里不需要使用LINQ

string strValue = "MyString[]{";
char[] findArray = { '[', ']', '{' };
char[] replaceArray = { '(', ')', '-' };
char[] charsValue = strValue.ToCharArray();
for (int i = 0; i < charsValue.Length; i++)
{
    for (int j = 0; j < findArray.Length; j++)
    {
        if (charsValue[i] == findArray[j])
        {
            charsValue[i] = replaceArray[j];
            continue;
        }
    }
}
string newStrValue = new string(charsValue); // MyString()-

这里有一个一行的解决方案:

string strValue = "MyString[]{";
char[] findArray = { '[', ']', '{' };
char[] replaceArray = { '(', ')', '-' };
string newStr = String.Join("", strValue.Select(c => findArray.Contains(c) ? replaceArray[Array.IndexOf(findArray, c)] : c));
Console.WriteLine(newStr); // MyString()-