当只有一个项目时,ArrayList为null

时间:2014-04-11 16:09:37

标签: c# arraylist foreach

我有一段有效的代码,但我觉得它有点不合适。当只有一个项目时,advertiserListnull。 C#不能将它视为一个项目的循环吗?我该如何清理这段代码?感谢。

if{} else{}的内部部分都做同样的事情。我只是想获取广告客户信息。

// build the advertiser loop
var advertiserList = campaignAdvertiserContainer["Advertiser"] as ArrayList;
if (advertiserList != null) // if multiple advertisers exist per campaign
{
    foreach (Dictionary<string, object> advertiser in advertiserList)
    {
        Dictionary<string, object> multipleCampaignAdvertiserLookup = new Dictionary<string, object>();
        multipleCampaignAdvertiserLookup.Add("CampaignId", campaign["id"].ToString());
        multipleCampaignAdvertiserLookup.Add("AdvertiserId", advertiser["id"].ToString());
        multipleCampaignAdvertiserLookup.Add("MediaCode", advertiser["MediaCode"].ToString());
        multipleCampaignAdvertiserLookup.Add("BusinessKey", advertiser["BusinessKey"].ToString());
        multipleCampaignAdvertiserLookup.Add("CreatedBy", System.Reflection.Assembly.GetExecutingAssembly().FullName.ToString());
        multipleCampaignAdvertiserLookup.Add("CreatedDt", DateTime.Now.ToString());

        campaignAdvertiserLookupArray.Add(multipleCampaignAdvertiserLookup);
    }
}
// there's only one advertiser, no need to loop
else
{
    Dictionary<string, object> singleAdvertiser = (Dictionary<string, object>)campaignAdvertiserContainer["Advertiser"];
    Dictionary<string, object> singleCampaignAdvertiserLookup = new Dictionary<string, object>();
    singleCampaignAdvertiserLookup.Add("CampaignId", campaign["id"].ToString());
    singleCampaignAdvertiserLookup.Add("AdvertiserId", singleAdvertiser["id"].ToString());
    singleCampaignAdvertiserLookup.Add("MediaCode", singleAdvertiser["MediaCode"].ToString());
    singleCampaignAdvertiserLookup.Add("BusinessKey", singleAdvertiser["BusinessKey"].ToString());
    singleCampaignAdvertiserLookup.Add("CreatedBy", System.Reflection.Assembly.GetExecutingAssembly().FullName.ToString());
    singleCampaignAdvertiserLookup.Add("CreatedDt", DateTime.Now.ToString());

    campaignAdvertiserLookupArray.Add(singleCampaignAdvertiserLookup);
}

3 个答案:

答案 0 :(得分:3)

如果你有一个包含一个项目的集合,那么是的,你可以使用foreach循环,无论如何,但这不是你拥有的。您将实际项目粘贴到该容器中,而不是大小为1的集合。

您应该修改任何代码将值放入此对象,以便始终放入集合中。如果没有物品,则应将其放入空集合中,如果有一个物品,则应将其放入带有一个物品的集合中,如果有多个物品则应放入所有这些物品中。如果你这样做,你总是可以foreach结果,而不需要null检查。这样做是为了编写由于C#类型系统而在编译时验证的程序。它们不仅更容易编写,而且您知道只要它编译,它就会起作用。

您还应避免使用ArrayList,而应使用通用List<T>。就像避免使用object变量来保留项目或项目列表一样,您应该始终努力将类型静态约束到您需要的类型。

答案 1 :(得分:3)

问题在于调用方法的代码:它传递单个项目与传递多个项目不同。

首选解决方案是更改它,并传递一个包含单个项目的数组列表,而不是在只有一个项目时传递“裸”项。如果它不是一个选项,请更改您的代码以自己创建一个数组列表,如下所示:

var advertiserList = campaignAdvertiserContainer["Advertiser"] as ArrayList;
if (advertiserList == null) {
    advertiserList = new ArrayList {
         campaignAdvertiserContainer["Advertiser"]
    };
}

此时,advertiserList是if语句的正分支所期望的。您可以将if的两个分支替换为其第一个分支(即包含for循环的分支)。

答案 2 :(得分:2)

首先,这与C#如何对待事物无关。这是代码。

campaignAdvertiserContainer["Advertiser"]显然是单一项目。这个代码应该单个项目的ArrayList放入那里。

其次,ArrayList已过时。相反,代码应使用List<Dictionary<string,object>>