字典TryGetValue
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典TryGetValue相关的知识,希望对你有一定的参考价值。
当用户离开我的应用程序时,我想在Windows手机中保留状态。
如何创建从字典中获取价值的通用方法TryGetValue
?
我的代码到目前为止:
public class StatefulPhoneApplication : PhoneApplicationPage
{
#region constructor
public StatefulPhoneApplication()
{
IsNewPageInstance = true;
}
#endregion
#region properties
protected bool IsNewPageInstance { get; private set; }
protected bool IsStatePreserved
{
get
{
if (this.State.ContainsKey("StatePreserved"))
return (bool)this.State["StatePreserved"];
else
return false;
}
}
#endregion
#region preservation methods
protected void PreserveControlState(Control control)
{
if (control is TextBox)
PreserveTextBoxState(control as TextBox);
else
PreserveCheckBoxState(control as CheckBox);
this.State["StatePreserved"] = true;
}
protected void PreserveTextBoxState(TextBox textBox)
{
this.State[textBox.Name + ".Text"] = textBox.Text;
this.State[textBox.Name + ".SelectionStart"] = textBox.SelectionStart;
this.State[textBox.Name + ".SelectionLength"] = textBox.SelectionLength;
}
protected void PreserveCheckBoxState(CheckBox checkBox)
{
this.State[checkBox.Name + ".IsChecked"] = checkBox.IsChecked;
}
protected void PreserveFocusState(FrameworkElement parent)
{
Control focusedControl = FocusManager.GetFocusedElement() as Control;
if (focusedControl == null)
{
this.State["FocusedControlName"] = null;
}
else
{
Control controlWithFocus = parent.FindName(focusedControl.Name) as Control;
if (controlWithFocus == null)
{
this.State["FocusedElementName"] = null;
}
else
{
this.State["FocusedElementName"] = focusedControl.Name;
}
}
}
#endregion
#region restoration methods
private void RestoreControlState(Control control)
{
if (control is TextBox)
RestoreTextBoxState(control as TextBox, string.Empty);
else if (control is CheckBox)
RestoreCheckBoxState(control as CheckBox, false);
}
#endregion
}
我想打电话就像这样。
private void RestoreTextBoxState(TextBox textBox, string defaultValue)
{
textBox.Text = TryGetValue<string>(textBox.Name + ".Text", defaultValue);
textBox.SelectionStart = TryGetValue<int>(textBox.Name + ".SelectionStart", defaultValue);
textBox.SelectionLength = TryGetValue<int>(textBox.Name + ".SelectionLength", defaultValue);
}
我找不到一个有效的好样本。
答案
这是我使用的IDictionary的扩展方法:
public static TValue GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> @this, TKey key, TValue @default = default(TValue)) {
if (@this == null) return @default;
TValue value;
return @this.TryGetValue(key, out value) ? value : @default;
}
用法:
Dictionary<int, string> dict = new Dictionary<int, string>() {
{ 1, "one" },
{ 3, "three" }
};
string one = dict.GetValueOrDefault(1, "one");
string two = dict.GetValueOrDefault(2, "two");
string three = dict.GetValueOrDefault(3, "three");
在上面的代码之后,one
,two
和three
都将被设置为正确的字符串值,即使字典没有密钥2
的条目
要在没有扩展方法的情况下实现您想要的功能,您只需使用方法的主体:
string temp;
string two = dict.TryGetValue(2, out temp) ? temp : "two";
以上是关于字典TryGetValue的主要内容,如果未能解决你的问题,请参考以下文章
C#中Dictionary的TryGetValue和Contains
C#中Dictionary的TryGetValue和Contains
dotnet ConcurrentDictionary 的 GetOrAdd 性能比 TryGetValue 加 TryAdd 低