我可以将其重写为lambda表达式吗?

时间:2016-09-29 15:56:43

标签: c# lambda

我的代码中有一些逻辑,我想知道是否有更好的方法来重写它。我有两个用户定义的服务器对象(serverA和serverB),如果它们都是enum ServerType WebDatabase,我想继续。

目前的代码很笨:

if((serverA.ServerType == ServerType.Web || serverA.ServerType == ServerType.Database) && (serverB.ServerType == ServerType.Web || serverB.ServerType == ServerType.Database))
{
    // do stuff
}

我正在以优雅简洁的方式写作。

7 个答案:

答案 0 :(得分:5)

我在用户定义的服务器对象中有一个新属性

public class Server
{
    public ServerType ServerType { get; set; }

    public bool IsDatabaseOrWeb
    {
        get
        {
            return ServerType == ServerType.Web || ServerType == ServerType.Database;
        }            
    }
}

然后你的功能看起来像这样

if (serverA.IsDatabaseOrWeb && serverB.IsDatabaseOrWeb)
{
   // do stuff
}

答案 1 :(得分:2)

这样就可以更明确地说明您正在询问有关两台服务器的相同问题,并允许您根据需要在一个地方更改条件。

if(IsRightType(serverA) && IsRightType(serverB))
{
    // do stuff
}

bool IsRightType(Server server)
{
    return server.ServerType == ServerType.Web || server.ServerType == ServerType.Database;
}

答案 2 :(得分:0)

也许以下解决方案会更优雅。实现一个抽象类,以便所有服务器对象都从它继承。

public enum ServerType
{
    Web,
    Database,
    SomethingElse
}

public class ServerA : ServerObject
{
}

public class ServerB : ServerObject
{
}

public abstract class ServerObject
{
    public ServerType ServerType { get; set; }
}

然后实现一个方法来检查一个对象是否符合你的条件。

public bool IfWebOrDatabase(ServerObject so)
{
    return so.ServerType == ServerType.Web || so.ServerType == ServerType.Database;
}

然后使用更短版本的If

if (IfWebOrDatabase(serverA) && IfWebOrDatabase(serverB))
{
    // do stuff
} 

答案 3 :(得分:0)

类似的方法是使用enum ServerType的扩展方法。编写代码的可能方法如下:

public enum ServerType
{
    Web,
    Database,
    Bi
}

public static class Extensions
{
    public static bool IsOperational(this ServerType st)
    {
        var operationalTypes  = new List<ServerType> { ServerType.Web, ServerType.Database };
        return operationalTypes.Contains(st);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var st1 = ServerType.Web;
        var st2 = ServerType.Database;
        var st3 = ServerType.Bi;

        bool isSt1Operational = st1.IsOperational();
        bool isSt2Operational = st2.IsOperational();
        bool isSt3Operational = st3.IsOperational();
    }
}

答案 4 :(得分:0)

向包含ServerType的类添加属性:

public bool IsDatabaseOrWeb
{
   get
   {
      return (ServerType == ServerType.Web || ServerType == ServerType.Database);
   }
}

然后使用它:

if(ServerA.IsDatabaseOrWeb && ServerB.IsDatabaseOrWeb)
{
}

答案 5 :(得分:0)

您应该在这些答案中注意到的趋势是解决方案比问题更糟糕。如果你想在linq中使用lambda表达式,那就更糟了:

if (new Server[] { serverA, serverB }.All(s => new ServerType[] { ServerType.Web, ServerType.Database }.Contains(s.ServerType)))
{ 
}

即使你把它分开:

var badIdea = new Server[] { entity, serverB };
var alsoBad = new ServerType[] { ServerType.Web, ServerType.Database };

if (badIdea.All(s => alsoBad.Contains(s.ServerType)))
{
}

有时候最简单的表达方式仍然很混乱。你的if语句没有改变。也许只是在中间放一个回车,这样你就可以一次在屏幕上看到它。

答案 6 :(得分:0)

Bitflags可能会有帮助。

[Flags]
public enum ServerType
{
    None = 0,
    Web=1,
    Database = 2,
    Other = 4
}

使用它

var flags = ServerType.Web | ServerType.Database;
var bothWebOrDb = (serverA.ServerType & flags) 
    & (serverB.ServerType & flags);
if (bothWebOrDb != ServerType.None)
{                
}

将其简化为以下

var flags = ServerType.Web | ServerType.Database;
var bothWebOrDb = serverA.ServerType & serverB.ServerType & flags;
if (bothWebOrDb != ServerType.None)
{                
}