我有一段有效的代码,但我觉得它有点不合适。当只有一个项目时,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);
}
答案 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>>
。