繁体   English   中英

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

[英]Can I rewrite this as a lambda expression?

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

目前的代码很笨拙:

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

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

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

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
}

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

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

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

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

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
} 

类似的方法是对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();
    }
}

将属性添加到包含ServerType的类:

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

然后使用它像:

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

您应该在这些答案中注意到的趋势是解决方案比问题更糟糕。 如果你想在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语句没有改变。 也许只是在中间放一个回车,这样你就可以一次在屏幕上看到它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM