2013-06-19 72 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戴夫 –

相关问题