有没有比编写多个几乎做同样事情的If语句更好的方法

时间:2015-10-01 07:10:38

标签: asp.net if-statement c#-4.0

我在其中一个函数中有多个 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并试图在这里使用相同的方法来减少代码,但没有成功。

提前感谢所有人。

3 个答案:

答案 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
}
}