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++;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值