2015-10-20 35 views
1

我得到了一些帶有一些特殊字符的字符串。在c中查找和替換基於兩個數組的字符#

string strValue = "MyString[]{"; 

在這裏,字符串strValue中包含一些特殊的字符和這些字符中的字符數組arrFindString和相應的字符提到需要與另一個字符陣列中arrReplaceString具有相同索引的位置的字符來代替。

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

所以在我的情況下,字符串strValue中有一個名爲「[」。所以首先我們需要找到findArray該字符的對應的索引那麼我們就需要與具有相同的字符替換字符的字符在replaceArray。所以這裏指數「[」必須被替換爲「(」

有什麼辦法可以使用LINQ來完成相同的?... 我使用每個。請幫助

+0

是的,它可以,但'foreach'是更爲自然,並會更容易維護。 – Richard

回答

1

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)))); 
+0

每個答案似乎工作正常......並感謝所有人 – Intruder

1
知道它可能

這是最佳的方式,不需要在這裏使用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()- 
+0

你確定'O(m * n)'其中'm = charsValue.Length; n = findArray.Length'是解決這個問題的好方法嗎? –

+0

@SerhiyChupryk是什麼讓你覺得有更好的方法? –

+0

這個問題應該有(直覺)線性解決方案,像Dmitry Bychenko提出的線性解決方案 –

2

首先,我寧願結合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 loop:

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(); 
1

這裏有一個單行的解決方案:

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()-