在C#中使用字典中的值交换键

时间:2014-11-25 16:46:06

标签: c# dictionary

我试图验证文本框是否包含字典中包含的密钥,如果是,请将其替换为关联的值,而不会丢失其中的其余文本。这是我到目前为止所做的,但它似乎没有做任何事情。

string s = txtID.Text;
if (s.StartsWith("S"))
{
    SMS s1 = new SMS();

    if (txtSender.Text.StartsWith("+") && txtSender.Text.Length.Equals(14))
    {
        s1.id = txtID.Text;
        s1.setCharacterLimit();
        s1.datereceived = Convert.ToInt32(txtDate.Text);
        s1.MessageBody = txtMessage.Text;
        foreach (string k in data.Keys)
        {
            foreach (string v in data.Values)
            {
                if (data.ContainsKey(s1.MessageBody))
                {
                    txtMessage.Text.Replace(k, v);
                }
            }
        }
        s1.Sender = txtSender.Text;
        if (s1.MessageBody.Length < s1.CharacterLimit)
        {
            lsttest.Items.Add(s1.id);
            lsttest.Items.Add(s1.datereceived);
            lsttest.Items.Add(s1.MessageBody);
            lsttest.Items.Add(s1.Sender);
        }
    }
    else
    {
        MessageBox.Show("This message was not accepted");
        txtSender.Clear();
    }
}

3 个答案:

答案 0 :(得分:3)

txtMessage.Text.Replace(k, v);

应该是:

txtMessage.Text = txtMessage.Text.Replace(k, v);

答案 1 :(得分:0)

有几个问题。一个是你没有设置Replace的结果。其次,双foreach循环将导致大量不必要的循环,并可能进行错误的替换。此外,我假设您确实要设置s1.MessageBody而不是原始txtMessage.Text,在这种情况下,我认为您甚至不需要使用Replace

替换此

foreach(string k in data.Keys)
foreach(string v in data.Values)
{
    if(data.ContainsKey(s1.MessageBody))
    {
        txtMessage.Text.Replace(k, v);
    }
}

有了这个

if(data.ContainsKey(s1.MessageBody))
{
    s1.MessageBody = data[s1.MessageBody];
}

修改

听起来你真正想要的是以下内容。

foreach(var kvp in data)
{
    s1.MessageBody = s1.MessageBody.Replace(kvp.Key, kvp.Value);
}

而不是Dictionary<string, string>你可以使用List<Tuple<string, string>>,但它不会产生很大的不同。你只是没有获得字典带来的任何好处。

答案 2 :(得分:0)

确实,你需要改变

txtMessage.Text.Replace(k, v);

txtMessage.Text = txtMessage.Text.Replace(k, v);

但似乎您的代码存在一些问题。首先是密钥的双重迭代,然后是字典的值,似乎没有任何意义。你可以这样做:

string value = "";
if (data.TryGetValue(s1.MessageBody, out value))
{
    txtMessage.Text = txtMessage.Text.Replace(s1.MessageBody, value);
}