我在其中一个函数中有多个 if语句,确切地说是22。所有 if语句几乎都做同样的事情,这使得函数看起来非常大。
例如
if( filter.FirstIds != null )
{
foreach( var activityId in filter.FirstIds )
{
var first = DataWarehouseData.DimFirsts.FirstOrDefault( a => a.FirstID == firstId );
if( first != null )
{
firstSKs.Add( first.FirstSK );
}
}
skCollection.Add( "FirstSK", firstSKs );
}
if( filter.SecondIds != null )
{
foreach( var SecondId in filter.SecondIds )
{
var Second = DataWarehouseData.DimSeconds.FirstOrDefault( s => s.SecondID == secondId );
if( second != null )
{
secondSKs.Add( Second.SecondSK );
}
}
skCollection.Add( "SecondSK", SecondSKs );
}
过滤器是一个图表过滤器,我不能在其上应用foreach循环,因为它没有GetEnumerator()函数。
实际上我正在经历过滤的所有22个DataMembers(属性)并且取决于DataMember,从特定表中提取数据。因此,如果我检查 filter.FirstIds 而不是来自 DimFirsts 表的数据,如果 filterData.SecondIds ,则数据将来自 DimSeconds 表等
我试图在谷歌搜索,但由于这是特定的情况,我无法找到任何方法来实现这一目标。我找到了Reflection并试图在这里使用相同的方法来减少代码,但没有成功。
提前感谢所有人。
答案 0 :(得分:2)
显然,我不知道任何事物的确切类型或代码的整体结构,但基本思路如下:
window
使用此功能,您的代码变为:
void PerformFiltering<T>(IEnumerable<int> ids, Func<int, T> resolveItemCallback, Action<T> addItemCallback, Action addCollectionCallback)
{
if(ids == null) return;
foreach(var id in ids)
{
var item = resolveItemCallback(id);
if(item == null) return;
addItemCallback(item);
}
addCollectionCallback();
}
答案 1 :(得分:0)
最佳做法是在构造函数中默认初始化集合,以使其不为null。即使集合为空 - for和foreach循环也不会被执行。
如果你不能用集合修改对象 - 你可以使用??像这样的运算符:
foreach (int activityId in filterData.ActivityIds ?? new List<int>())
{
...
}
答案 2 :(得分:0)
创建一个包含表达式值的布尔数组,然后在类似
的循环中执行for (int i=0;i<arr.length;i++)
{
if(arr[i])
{
//your code that to be repeated
}
}