如何优化下面的代码

时间:2017-03-27 07:39:41

标签: c# optimization

如何优化下面的代码,下面的代码包含一个可能具有不同类型的类对象的对象数组。我宁愿转移案例而不是if ... else ......我怎么能这样做。

object[] emailObjs;
for (int i = 0; i < emailObjs.Length; i++)
{
if (emailObjs[i] != null)
    {
       if (emailObjs[i] is Rfq)
       {

       }
       else if (emailObjs[i] is RfqBid)
       {

       }
       else if (emailObjs[i] is RfqProjManager)
       {

       }
    }
}

3 个答案:

答案 0 :(得分:2)

在带有类型检查的switch语句中使用C# 7 pattern matching

switch (emailObjs[i])
{
    case Rfq r:
        {
            // use r;
            break;
        }
    case RfqBid r:
        {
            // use r;
            break;
        }
}

虽然这会显着地压缩代码,但在性能方面它不会比一堆if语句带来太多好处,例如在示例代码中。

答案 1 :(得分:1)

这是我的尝试:

Rfq,RfqBid和RfqProjManager实现相同的接口。我们称之为IRfq。

interface
{
     void DoSomeWork();
}

然后,你的for循环可能是这样的:

for (int i = 0; i < emailObjs.Length; i++)
{
    if (emailObjs[i] != null && emailObjs is IRfq)
    {
           ((IRfq)emailObjs[i]).DoSomeWork();
    }
}

您的设计是否可行?

答案 2 :(得分:0)

使用一种方法定义所有3个类的通用接口:

public interface IRfq
{
    void DoSomething();
}

public class Rfq : IRfq
{
    public void DoSomething()
    {
        //...
    }
}

public class RfqBid : IRfq
{
    public void DoSomething()
    {
        //...
    }
}

public class RfqProjManager : IRfq
{
    public void DoSomething()
    {
        //...
    }
}

你可以在你的for循环中只做一次调用。

IRfq[] emailObjs;
for (int i = 0; i < emailObjs.Length; i++)
{
   emailObjs[i]?.DoSomething();
}