【问题标题】:ArrayList is null when there's only one item当只有一项时 ArrayList 为空
【发布时间】:2014-04-11 16:09:36
【问题描述】:

我有一段代码可以运行,但我认为有点不雅。当只有一项时,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);
}

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 这里有点可疑。一开始您要求将您的campaignAdvertiserContainer["Advertiser"] 视为一个ArrayList,如果结果为null,则您的else 条件将其转换为(Dictionary)。那个变量campaignAdvertiserContainer["Advertiser"]的真正内容是什么?
  • @Steve 他们都是Dictionary&lt;string, object&gt;。我发现 ArrayList 是唯一可以让我使用 foreach 循环的类型。
  • 仍然缺少一些东西。 CampaignAdvertiserContainer 的类型是什么?你能显示你初始化它并添加值的代码吗?
  • 尝试将campaignAdvertiserContainer["Advertiser"] 设为List>

标签: c# arraylist foreach


【解决方案1】:

如果您有一个包含一个项目的集合,那么可以,无论如何您都可以使用foreach 循环,但这不是您所拥有的。您将实际项目卡在该容器中,而不是一个尺寸的集合。

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

您还应该避免使用ArrayList,而应该使用通用的List&lt;T&gt;。就像避免使用 object 变量来保存一个项目或项目列表一样,您应该始终努力将您的类型静态地限制为您需要的类型。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      首先,这与 C# 处理事物的方式无关。这是代码。

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

      其次,ArrayList 已过时。相反,代码应该使用List&lt;Dictionary&lt;string,object&gt;&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多