C# 如何优化下面的代码

C# 如何优化下面的代码,c#,optimization,C#,Optimization,如何优化下面的代码,下面的代码包含一个对象数组,该数组可能具有不同类型的类对象。我想换个箱子,而不是如果……否则。。。我怎么能做到呢 object[] emailObjs; for (int i = 0; i < emailObjs.Length; i++) { if (emailObjs[i] != null) { if (emailObjs[i] is Rfq) { } else if (emailObjs[i] is

如何优化下面的代码,下面的代码包含一个对象数组,该数组可能具有不同类型的类对象。我想换个箱子,而不是如果……否则。。。我怎么能做到呢

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)
       {

       }
    }
}
object[]emailObjs;
for(int i=0;i
在带有类型检查的
开关
语句中使用:

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

虽然这将显著压缩代码,但在性能方面,它不会比一堆
if
语句(如示例代码中的语句)有多大好处。

使用一种方法为所有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();
}
IRfq[]emailObjs;
for(int i=0;i
以下是我的尝试:

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();
    }
}
for(int i=0;i

你的设计有可能吗

但是你的
else如果
s什么都不做……C#7.0中有一个新特性:带模式的Switch语句。您可以在C#7.0中执行
切换emailObjs[i]{case Rfq r:…case RfqProjManager rpm:…
您可以在C#7.0中执行此操作。如果顺序不重要,您可以使用
foreach(emailObjs.OfType()中的var obj)//做点什么
这是至少几十个其他问题的重复,你的研究表明了什么?而且,一般来说,当你需要它时,这是一种设计的味道。这段代码到底应该做什么?如果他们想对所有对象调用
DoSomething()
,而它还没有定义该方法的基类。“你的设计有可能吗?”-然后先发表评论问这个问题,而不是在回答中猜测。是的,我知道,但这并不意味着你应该发表答案……无论如何,你现在有50个声誉。谢谢你的建议(和声誉)。下次我会做得更好。