在 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();
}
}
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>>
,但这不会有很大的不同。 你只是没有得到字典的任何好处。