在 C# 中将键与字典中的值交换

本文关键字:字典 交换 | 更新日期: 2023-09-27 18:32:00

我正在尝试验证文本框是否包含字典中包含的键,如果是,请将其替换为关联的值,而不会丢失其中的其余文本。这就是我到目前为止所拥有的,但它似乎没有任何作用。

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

在 C# 中将键与字典中的值交换

txtMessage.Text.Replace(k, v);

应该是:

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

确实,您需要更改

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);
}

有几个问题。 一个是你没有设置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>>,但这不会有很大的不同。 你只是没有得到字典的任何好处。