• Dictionary(二)


    这是问题:

    各位好!我已用Dictionary<string,string>获取了数据,现在想将name对应的value赋给一个对象数组中,请问用C#如何写语句?
    我写的代码如下:
      public AlarmNotificationLoginInfo[] mappingByNotificationLoginInfo(Dictionary<string, string> dic)
       {
       AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
        
      int i = 0;
       try
       {
       if (dic != null && dic.Count > 0)
       {
       foreach (KeyValuePair<string, string> kvp in dic)
       {

       if (i < dic.Count)
       {
       switch (kvp.Key)
       {
       case "username":
       anli[i].Username = kvp.Value;
       break;
       case "password":
       anli[i].Password = kvp.Value;
       break;
       default:
       break;
       }
       }
       }
       i++;
       }
       }
       catch (Exception e)
       {
       throw e;

       }
       return anli;
       }

    问题出现在标红的地方,抛出异常:未将对象引用设置到对象的实例。
    我已定义了数组的大小,为什么这里赋值就出错了呢?恳请各位高手指点一下!

    猜想,AlarmNotificationLoginInfo构造函数中username 为null

    回复一:

    anli[i].Username = kvp.Value;
    改为:
    anli[i].Username = kvp.Value==null?"":kvp.Value;

    回复二:


    AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count]
    anli[0]是null的,应该先new AlarmNotificationLoginInfo()
    还有
    i++;应该放在foreach内。

    回复三:

    AlarmNotificationLoginInfo 类是这么写的:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    /// <summary>
    /// AlarmNotificationLoginInfo 的摘要说明
    /// </summary>
    public class AlarmNotificationLoginInfo
    {
     public AlarmNotificationLoginInfo()
     {
     //
     // TODO: 在此处添加构造函数逻辑
    //
     }

       private string username;
       private string password;

       /// <summary>
       /// 用户名
       /// </summary>
       public string Username
       {
       get { return username; }
       set { username = value; }
       }

       /// <summary>
       /// 密码
       /// </summary>
       public string Password
       {
       get { return password; }
       set { password = value; }
       }
    }
    lyb018提示说“AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count]
    anli[0]是null的,应该先new AlarmNotificationLoginInfo()”,那是不是要先对对象数组进行初始化?
    我又加上了下面这段代码:
       AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
       int i = 0;
       for (i = 0; i < anli.Length; i++)
       {
       anli[i].Username = "";
       anli[i].Password = "";
       }
    但是调试仍然抛出异常:使用new关键字创建对象实例,是不是要
    AlarmNotificationLoginInfo a = new AlarmNotificationLoginInfo();
    然后再对对象a进行初始化呀?恳请各位解答。

    回复四:

    AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
    我已经创建了对象实例,为什么还会报空指向的异常呢?

    精华推荐:如何让gridview中的checkbox根据数据库情况默认选中?
     

    AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
    这里你要新建一个对象:
    AlarmNotificationLoginInfo anliTest = new AlarmNotificationLoginInfo();
    anliTest.Username = "放入你想要的值";
    anliTest.Password = "放入你想要的值";
    然后加到数组中.

    AlarmNotificationLoginInfo[]这个是一个AlarmNotificationLoginInfo这种类型的数组,所以要先实例化一个这种类型,然后加进去.

    AlarmNotificationLoginInfo anliTest = new AlarmNotificationLoginInfo();
    switch (kvp.Key)
       {
       case "username":
       anliTest.Username = kvp.Value;
       break;
       case "password":
       anliTest.Password = kvp.Value;
       break;
       default:
       break;
       }
    anli[i] = anliTest;


    是kvp为null吧???

    你赋值前先判断下kvp是不是null!
     

    kvp不为null

    回复五:

    还有一个问题想请教一下:
    现在我的代码按网友lyb018的提示修改如下:
      if (dic != null && dic.Count > 0)
       {
       foreach (KeyValuePair<string, string> kvp in dic)//取内容
    {
    switch (kvp.Key)
     {
     case "username":
     al.Username = (kvp.Value == null ? "" : kvp.Value);
     break;
     case "password":
     al.Password = (kvp.Value == null ? "" : kvp.Value);
     break;
     default:
     break;
     }
     }

       //获取记录条数
        
      for (int i = 0; i < dic.Count; i++)
       {
       anli[i] = al;
       }
       }
    现在能将对象放在对象数组中了。调试是取到的记录只有一条,但是dic.Count=2(我知道i<dic.Count肯定是不对的),但我现在怎么获得蓝色部分记录的条数,也就是下面标红的循环,怎么获取i<对象个数,这个对象个数怎么获得?恳请高手解答。

    也就是如何根据dic.Count获取应该分配多大的空间给数组?

    C# code
            public AlarmNotificationLoginInfo[] mappingByNotificationLoginInfo(Dictionary<string, string> dic)
            {
                AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];

                int i = 0;
                try
                {
                    if (dic != null && dic.Count > 0)
                    {
                        foreach (KeyValuePair<string, string> kvp in dic)
                        {
                            if (i < dic.Count)
                            {
                                anli[i] = new AlarmNotificationLoginInfo();
                                switch (kvp.Key)
                                {
                                    case "username":
                                        anli[i].Username = kvp.Value;
                                        break;
                                    case "password":
                                        anli[i].Password = kvp.Value;
                                        break;
                                    default:
                                        break;
                                }
                            }
                            i++;
                        }
                    }
                }
                catch (Exception e)
                {
                    throw e;

                }
                return anli;
            }


    C# code  foreach (KeyValuePair<string, string> kvp in dic)
      {

      if (i < dic.Count)
      {
      switch (kvp.Key)
      {
      case "username":
      anli[i].Username = kvp.Value;
      break;
      case "password":
      anli[i].Password = kvp.Value;
      break;
      default:
      break;
      }
      }
      }
      i++;

     学习是个过程,我们总是先看人家的代码,自己在学习到,以后遇到就会编译啦!感兴趣的话,自己调一下吧!

  • 相关阅读:
    hadoop集群的搭建
    EclipseAndroid打包签名发布安装失败闪退运行不了
    [目录]C#学习笔记
    [目录]搭建一个简单的WebGIS应用程序
    实现DataTables搜索框查询结果高亮显示
    解决将Excel表导入到SQL Server数据库时出现Text was truncated or one or more characters had no match in the target code错误
    将展示内容(div、iframe)放在Expand控件中
    [C#学习笔记1]用csc.exe和记事本写一个C#应用程序
    选中FeatureLayer元素并高亮显示
    在地图中调用显示FeatureLayer并进行render、popupTemplate、添加图例等相关内容的设置
  • 原文地址:https://www.cnblogs.com/SanMaoSpace/p/2147986.html
Copyright © 2020-2023  润新知