【问题标题】:Instancing with a dictionary用字典实例化
【发布时间】:2012-04-02 01:07:04
【问题描述】:

我目前正在做一个项目,该项目创建一个字典,其中实例的 int 索引和复杂类型作为值。由于这是一个庞大的学校项目,我不想发布大量代码,因为我有一个逻辑问题,而不是“我需要代码”。我会尽量讲清楚,如果有什么我需要更好地解释的,请告诉我。

首先。我的服务器中有一本字典:

private Dictionary<int,List<complexType>> dictName = new  Dictionary<int,List<complexType>>

每次客户端启动时,它都会向字典注册(我创建一个空白复杂类型来实例化它,然后我加载字典):

List<complexType> temp = null;
dictName.Add(id,temp)

然后,当我想为特定实例添加到列表中时,我会这样做:

complexType myItem = new complexType();
dictName[id].Add(myItem);

当我运行此代码时,当第二个客户端尝试运行时出现错误:

"一个未处理的异常类型 'System.Reflection.TargetInvocationException' 发生在 mscorlib.dll。附加信息:异常已由 调用的目标。

现在当第二个用户点击时会发生这种情况: dictName.Add(id,temp) 来自第一部分。

如果我将 temp 的实例化更改为 List&lt;complexType&gt; temp = new List&lt;complexType&gt;();

然后它通过了那个点,但是当它更新客户端时我再次遇到同样的错误。

我目前正在使用这种方式通过 int 和 string(字典)传递数据 它们工作正常,但是当我在字典中添加复杂类型的列表时,出现上述错误。

如果有人有任何建议,我将不胜感激。我希望这与我最初加载的空白列表有关。如果您还有什么需要了解的,请询问谢谢!

【问题讨论】:

  • 有什么例外?发布的异常应该有一个 InnerException 属性。你能告诉我们它是什么吗?
  • @spender 我看了看,它似乎没有...当我通过它进行调试时,只是随机抛出 break 语句,但上面显示的异常除外。然后它会打开一个标签,说没有可用的来源。我也尝试输入一个try catch来获取信息,但它没有进入catch
  • 您是否尝试从不同的线程访问它?
  • “新的私人...()”?!我希望这只是一个错误。
  • 定义“当第二个用户点击”

标签: c# wpf client-server instance instantiation


【解决方案1】:

你正在制作一个列表字典。所以你试图添加到一个为空的列表中,这就是给你第一个例外的原因。

第二,我从未见过“新的私人词典”这是一个剪切和粘贴的错字吗?

这行得通:

Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>();
dictName.Add(0, new List<string>());
dictName[0].Add("First");
dictName.Add(1, new List<string>());
dictName[1].Add("Second");

你有一个复杂类型的列表而我有一个字符串列表这一事实应该无关紧要。

【讨论】:

    【解决方案2】:

    看起来您应该将字典条目初始化为:

    dictName.Add(id, new List<complexType>());
    

    您也可以尝试使用泛型 Lookup 类型,这基本上正是您所需要的 - 值列表的键。

    var lookupName = new Lookup<int, complexType>();
    
    lookup.Add(id, new complexType()); // Creates key 'id' and adds new ct.
    lookup.Add(id, new complexType()); // Adds new ct to existing key 'id'
    lookup.Add(651, null); // Creates key 651 and adds null
    

    所以你可以直接使用 add 方法将复杂类型实例添加到一个 id 键中,甚至不需要考虑该键是否存在。

    lookup[id]
    

    将返回一个链接到给定 id 的复杂类型的 IEnumerable。

    例子:

    var lu = new Lookup<int, string>();
    
    lu.Add(7, "Seven");
    lu.Add(7, "SEVEN");
    lu.Add(4, "Four");
    lu.Add(7, "7");
    lu.Add(4, "FOUR");
    lu.Add(4, "FOUR");
    
    Console.WriteLine(string.Join(", ", lu[7])); // "Seven, SEVEN, 7"
    Console.WriteLine(string.Join(", ", lu[4])); // "Four, FOUR, FOUR"
    
    foreach (var grp in lu)
    {
        int id = grp.Key;
    
        foreach (var str in grp)
        {
            ...
        }
    }
    

    【讨论】:

    • 我更改了 instatiation,但是当我执行“dictName[id].Add(myItem)”时,我想添加到该 id 的列表中,除非我误解了你的意思,否则每次都不要创建新列表代码。
    • Lookup 对每个键都有一个列表,当您使用我展示的 add 方法时,如果键不存在,它会创建一个新键和列表,如果存在则添加到现有列表.试试看。
    • @user1219627 我添加了另一个如何使用 Lookup 的示例。
    【解决方案3】:

    试试这个方法:

     Dictionary<int, List<string>> dictName = new Dictionary<int, List<string>>();
     dictName.Add(0, null);
     dictName[0] = new List<string>();
     dictName[0].Add("Hello");
    

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 2017-02-05
      • 2019-06-04
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      相关资源
      最近更新 更多