当存在';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);
}
如果你有一个集合,里面有一个项目,那么是的,不管怎样,你都可以使用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>>
。