检查字符串是否包含字典键 - >删除键并添加值

时间:2013-06-19 12:40:08

标签: c# linq generic-collections

我遇到了一个检查字符串('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个密钥中的一个,删除此密钥并将相应的字符串添加到源字符串的末尾?

注意:字母并非始终位于来源的末尾。

亲切的问候

3 个答案:

答案 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;
....

答案 1 :(得分: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);
}

编辑: 使用字符串的Replace方法,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);
}

检查并且有效!

答案 2 :(得分:2)

Nikola的答案很好,如果你喜欢它,你应该把它标记为答案。但是我喜欢这个简单的方法(略微借用了一些东西: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]);