[英]Can I rewrite this as a lambda expression?
我的代碼中有一些邏輯,我想知道是否有更好的重寫方法。 我有兩個用戶定義的服務器對象(serverA和serverB),如果它們都是enum ServerType
Web
或Database
,我想繼續。
目前的代碼很笨拙:
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.