B. *_*non 3 c# logic boolean-logic boolean boolean-operations
我编写了一个函数来比较客户端当前拥有的文件版本和服务器上文件的最新版本.客户端将"quad"(Major.Minor.Build.Private)版本号作为字符串传递给服务器,然后服务器使用FileVersionInfo:
// clientFileVersion will be in "quad" format, a la "3.1.4.1"
private bool ServerFileIsNewer(string clientFileVersion, FileVersionInfo serverFile)
{
// Don't say I never learned nuthin' from Steve McConnell
const int MAJOR_INDEX = 0;
const int MINOR_INDEX = 1;
const int BUILD_INDEX = 2;
const int PRIVATE_INDEX = 3;
string[] versionStrArray = clientFileVersion.Split('.');
int FileMajorPartClient;
Int32.TryParse(versionStrArray[MAJOR_INDEX], out FileMajorPartClient);
int FileMinorPartClient;
Int32.TryParse(versionStrArray[MINOR_INDEX], out FileMinorPartClient);
int FileBuildPartClient;
Int32.TryParse(versionStrArray[BUILD_INDEX], out FileBuildPartClient);
int FilePrivatePartClient;
Int32.TryParse(versionStrArray[PRIVATE_INDEX], out FilePrivatePartClient);
int FileMajorPartServer = serverFile.FileMajorPart;
int FileMinorPartServer = serverFile.FileMinorPart;
int FileBuildPartServer = serverFile.FileBuildPart;
int FilePrivatePartServer = serverFile.FilePrivatePart;
return ((FileMajorPartClient < FileMajorPartServer) ||
((FileMajorPartClient == FileMajorPartServer) && (FileMinorPartClient < FileMinorPartServer)) ||
((FileMinorPartClient == FileMinorPartServer) && (FileBuildPartClient < FileBuildPartServer)) ||
((FileBuildPartClient == FileBuildPartServer) && (FilePrivatePartClient < FilePrivatePartServer)));
}
Run Code Online (Sandbox Code Playgroud)
但后来我意识到,如果客户端版本为2.1.1.1且服务器版本为1.1.2.1,则我的megaboolean return语句将失败
IOW,它表明服务器版本更新,实际上(当然)它不是.
那么我想我会添加更多的布尔逻辑,例如:
if (FileMajorClient > FileMajorServer) ||
((FileMajorClient == FileMajorServer) && (FileMinorClient > FileMinorServer)) ||
((FileMajorClient == FileMajorServer) && (FileMinorClient == FileMinorServer) && (FileBuildClient > FileBuildServer))
{
return false;
}
else
{
return ((FileMajorPartClient < FileMajorPartServer) ||
((FileMajorPartClient == FileMajorPartServer) && (FileMinorPartClient < FileMinorPartServer)) ||
((FileMinorPartClient == FileMinorPartServer) && (FileBuildPartClient < FileBuildPartServer)) ||
((FileBuildPartClient == FileBuildPartServer) && (FilePrivatePartClient < FilePrivatePartServer)));
}
Run Code Online (Sandbox Code Playgroud)
......但正如你所看到的,它正变成疯狂/意大利面乱的大球.
必须有一种更好,更容易,更易于理解/可维护的方式来比较两个文件版本.但是/怎么样?
使用Servy的答案,这是现在的方法:
private bool ServerFileIsNewer(string clientFileVersion, FileVersionInfo serverFile)
{
Version client = new Version(clientFileVersion);
Version server = new Version(string.Format("{0}.{1}.{2}.{3}", serverFile.FileMajorPart, serverFile.FileMinorPart, serverFile.FileBuildPart, serverFile.FilePrivatePart));
return server > client;
}
Run Code Online (Sandbox Code Playgroud)
干净利落地吹哨,简洁如Joe Friday的梦想见证,和Grace Kelley一样优雅.
Ser*_*rvy 18
使用Version
课程:
Version first = new Version("1.1.2.1");
Version second = new Version("2.1.1.1");
bool b = first >= second;
Run Code Online (Sandbox Code Playgroud)