2013-06-19 71 views
1

我被卡在一個函數,它檢查字符串('14534000000875e')是否包含字母。 如果它包含一個字母(a-z),請刪除該字母並在末尾添加一個字符串。檢查字符串是否包含字典鍵 - >刪除鍵並添加值

爲了實現這一目標,我創建了一個Dictionary<char, string>偶已經映射到一個09001,B至09002 [...]和Z到09026

這是到目前爲止我的代碼:

public static string AlterSerial(string source) 
{ 
    Dictionary<char, string> pairs = new Dictionary<char, string>(); 
    pairs.Add('a', "09001"); 
    ... 

    int index = source.IndexOf(x); 
    if (index != -1) 
    { 
     return source.Remove(index, 1); 
    } 
    return source; 
} 

如何檢查source字符串是否包含26個密鑰之一,刪除此密鑰並將相應的字符串添加到源字符串的末尾?

注:字母並不總是在源代碼的末尾。

親切的問候

+1

如果字符串多次包含相同的字母會怎麼樣? – Andrei

+3

String.Replace(「a」,「09001」)等有什麼問題? – Jonesopolis

+0

信件是否總是在字符串的末尾? –

回答

6

試試這個:

Dictionary<char, string> pairs = new Dictionary<char, string>(); 
pairs.Add('a', "09001"); 
... 

foreach(KeyValuePair<string, string> entry in pairs) 
{ 
    if (source.Contains(entry.key)) 
    { 
     source = source.Replace(entry.key, "") + entry.Value; 
     break; 
    } 
} 

return source; 
.... 
+0

不要忘記,有26個字符,每個人都需要檢查字符串是否包含該字符,如果有,則替換它。看看是否有一封信,然後如果有,請從字典中替換它。 –

+0

是的,即使我打算輸入相同的邏輯...尼古拉的算法通常會更快... –

4

因此,這是你有你的字符串中只有一個字母的解決方案。您需要查找字符串中的字母(如果存在)並找到其索引。然後你必須插入相應的值,而不是從字典中獲得的字母。

String mystring = "1453400e0000875"; 
Dictionary<char, string> pairs = new Dictionary<char, string>(); 
pairs.Add('a', "09001"); 
pairs.Add('b', "09002"); 
pairs.Add('c', "09003"); 
pairs.Add('d', "09004"); 
pairs.Add('e', "09005"); 
//... 
char letter = mystring.FirstOrDefault(a => Char.IsLetter(a)); 
if (letter != '\0') 
{ 
     int index = mystring.IndexOf(letter); 
     string substitute; 
     pairs.TryGetValue(mystring[index], out substitute); 
     mystring = mystring.Substring(0, index) + substitute + mystring.Substring(index + 1); 
} 

編輯: 使用替換字符串的方法,該if部分可以改變這樣的:

char letter = mystring.FirstOrDefault(a => Char.IsLetter(a)); 
if (letter != '\0') 
{ 
     string substitute; 
     pairs.TryGetValue(letter, out substitute); 
     mystring = mystring.Replace(letter.ToString(), substitute); 
} 

EDIT2:如果我讓他想不正確理解OP刪除的文字和替換字符串添加到源字符串末尾時,if說法應該是這樣的:

if (letter != '\0') 
{ 
     string substitute; 
     pairs.TryGetValue(letter, out substitute); 
     mystring = mystring.Replace(letter.ToString(), ""); 
     mystring += substitute; 
} 

,這是在字符串中有更多字母時的泛化。這是類似的解決方案,但需要遍歷字符串中的所有字母。

String mystring = "1453a400e0000b875"; 
Dictionary<char, string> pairs = new Dictionary<char, string>(); 
pairs.Add('a', "09001"); 
pairs.Add('b', "09002"); 
pairs.Add('c', "09003"); 
pairs.Add('d', "09004"); 
pairs.Add('e', "09005"); 
//... 
var lettersList = mystring.Where(a => Char.IsLetter(a)); 
foreach (char letter in lettersList) 
{ 
     int index = mystring.IndexOf(letter); 
     string substitute; 
     pairs.TryGetValue(mystring[index], out substitute); 
     mystring = mystring.Substring(0, index) + substitute + mystring.Substring(index + 1); 
} 

Checked and it works!

+0

是的,我只是想處理其他可能的情況。 –

+0

這不是一個糟糕的解決方案,但它具體說明要添加到問題中字符串的末尾。等待澄清...... –

+0

@DaveWilliams OP在評論中特別提到:「只有一封信,它大部分在最後但並非總是」。後面的解決方案僅適用於任何情況。 –

2

尼古拉的回答是好,如果你喜歡它,你應該把它標記爲答案。不過,我喜歡這個簡單的方法(稍微借用一些東西:p)。

var Alphabet = "abcdefghijklmnopqrstuvwxyz".ToArray(); 

var Pairs = new Dictionary<char, string>(); 
for(var i = 1; i < Alphabet.Count() +1; i++) 
    Pairs.Add(Alphabet[i-1], "090" + (i < 10 ? "0" + i.ToString() : i.ToString())); 

var Source = "14534000000875e"; 

var Chars = Source.Where(x => Char.IsLetter(x)); 
var Output = string.Empty(); 

foreach(var Char in Chars) 
    Output = Source.Replace(Char.ToString(), Pairs[Char]); 

或者如果你想在最後的替換和只有一次重複的字符?

foreach(var Char in Chars) 
Output = Source.Replace(Char.ToString(),"") + (Pairs[Char]); 
+0

是的,這是一個很好的+1戴夫 –

相關問題