当存在';It’只有一项

本文关键字:一项 存在 It | 更新日期: 2023-09-27 17:57:52

我有一块代码可以工作,但我觉得有点不雅。当只有一个项目时,advertiserList就是null。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);
}

当存在';It’只有一项

如果你有一个集合,里面有一个项目,那么是的,不管怎样,你都可以使用foreach循环,但这不是你所拥有的。你把实际的物品卡在那个容器里,而不是一个一号的集合。

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

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

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

首选的解决方案是更改这一点,并传递带有单个项的数组列表,而不是在只有一个项时传递"裸"项。如果这不是一个选项,请更改您的代码,自己制作一个数组列表,如下所示:

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

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

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

CCD_ 14显然是单个项目。放在那里的代码应该将单个项的ArrayList放在那里。

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