【发布时间】:2020-04-24 12:17:26
【问题描述】:
我正在尝试以这样一种方式实现一个字典,它只会在 新值 大于 当前存在的值 时将某个值添加到键中>
所以基本场景是:
- 如果密钥不可用,它将创建一个新密钥和一个值
- 如果键可用,它将检查当前值是否大于已分配给该键的值,并且仅在大于时更新。
在我解释我在这里面临的问题之前是我的代码
static IDictionary<string, string> versionStack = new Dictionary<string, string>();
foreach(var item in RequiredApps)
{
nameOfApp = item.Key;
minimumVersionOfApp = item.Value.minVersion;
if (versionStack.TryGetValue(nameOfApp, out minimumVersionOfApp))
{
if (Convert.ToInt32(minimumVersionOfApp) >= Convert.ToInt32(item.Value.minVersion))
minimumVersionOfApp = item.Value.minVersion;
}
versionStack[nameOfApp] = minimumVersionOfApp;
}
注意:请不要担心for 循环,因为它工作正常并且在那里没有问题。只想显示给我问题的特定代码
现在我已经能够将功能实现到一定程度,但问题是当 TryGetValue 执行时,它会将我的所有值都变为 null。
我正在使用TryGetValue 来查看键是否有值,如果有则检索它。
我现在被困在这里,如果有人能帮助我告诉我我做错了什么,我将不胜感激。
编辑:-
鉴于我面临的问题非常不清楚,正如 Rufus L 所建议的那样,我正在添加一个示例虚拟应用程序,其中正是我面临的问题
希望这有助于消除任何困惑:)
class Program
{
static IDictionary<string, string> versionStack = new Dictionary<string, string>();
static string appName;
static string minVersion;
static void Main(string[] args)
{
AddOnce();
AddTwice();
}
public static void AddOnce()
{
appName = "app01";
minVersion = "1.0";
versionStack.Add(appName, minVersion);
}
public static void AddTwice()
{
string existingValue;
appName = "app01";
minVersion = "3.0";
if (!versionStack.TryGetValue("app01", out existingValue) || Convert.ToInt32(existingValue) < Convert.ToInt32(minVersion))
{
versionStack[appName] = minVersion;
}
}
}
【问题讨论】:
-
您是否调试并验证字典
dependentModuleStack中存在密钥?此外,您提到您检查 Dictionary 中的值并在它与条件匹配时更新它,但是在上面给出的代码中,您正在从一个字典中读取并更新另一个?这是期望的行为吗? -
为什么要使用
string值来存储int?看来您应该将其定义为:static IDictionary<string, int> versionStack = new Dictionary<string, int>(); -
你首先定义了
versionStack,然后你从不使用它。然后在您的代码中引用RequiredApps和dependentModuleStack,它们没有定义,但它们显然不使用string值类型(它没有minVersion属性)。请发布可以复制/粘贴的示例代码(即所有变量都已定义)。 -
@AnuViswan 我在格式化问题时犯了一个错误,对此我深表歉意,请您看一下已编辑的问题 :)
标签: c# .net string dictionary generics