我试图验证文本框是否包含字典中包含的密钥,如果是,请将其替换为关联的值,而不会丢失其中的其余文本。这是我到目前为止所做的,但它似乎没有做任何事情。
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();
}
}
答案 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);
}