ThinkinginLINQHarnessingthePowerofFunctionalProgrammingin.
NETApplicationsSudiptaMukherjeeThinkinginLINQ:Harnessingthepoweroffunctionalprogramingin.
NETapplicationsCopyright2014bySudiptaMukherjeeThisworkissubjecttocopyright.
AllrightsarereservedbythePublisher,whetherthewholeorpartofthematerialisconcerned,specificallytherightsoftranslation,reprinting,reuseofillustrations,recitation,broadcasting,reproductiononmicrofilmsorinanyotherphysicalway,andtransmissionorinformationstorageandretrieval,electronicadaptation,computersoftware,orbysimilarordissimilarmethodologynowknownorhereafterdeveloped.
Exemptedfromthislegalreservationarebriefexcerptsinconnectionwithreviewsorscholarlyanalysisormaterialsuppliedspecificallyforthepurposeofbeingenteredandexecutedonacomputersystem,forexclusiveusebythepurchaserofthework.
DuplicationofthispublicationorpartsthereofispermittedonlyundertheprovisionsoftheCopyrightLawofthePublisher'slocation,initscurrentversion,andpermissionforusemustalwaysbeobtainedfromSpringer.
PermissionsforusemaybeobtainedthroughRightsLinkattheCopyrightClearanceCenter.
ViolationsareliabletoprosecutionundertherespectiveCopyrightLaw.
ISBN-13(pbk):978-1-4302-6845-1ISBN-13(electronic):978-1-4302-6844-4Trademarkednames,logos,andimagesmayappearinthisbook.
Ratherthanuseatrademarksymbolwitheveryoccurrenceofatrademarkedname,logo,orimage,weusethenames,logos,andimagesonlyinaneditorialfashionandtothebenefitofthetrademarkowner,withnointentionofinfringementofthetrademark.
Theuseinthispublicationoftradenames,trademarks,servicemarks,andsimilarterms,eveniftheyarenotidentifiedassuch,isnottobetakenasanexpressionofopinionastowhetherornottheyaresubjecttoproprietaryrights.
Whiletheadviceandinformationinthisbookarebelievedtobetrueandaccurateatthedateofpublication,neithertheauthorsnortheeditorsnorthepublishercanacceptanylegalresponsibilityforanyerrorsoromissionsthatmaybemade.
Thepublishermakesnowarranty,expressorimplied,withrespecttothematerialcontainedherein.
ManagingDirector:WelmoedSpahrLeadEditor:JamesDeWolfDevelopmentEditors:RussellJonesTechnicalReviewer:FabioClaudioFerracchiatiEditorialBoard:SteveAnglin,MarkBeckner,GaryCornell,LouiseCorrigan,JamesDeWolf,JonathanGennick,RobertHutchinson,MichelleLowman,JamesMarkham,MatthewMoodie,JeffOlson,JeffreyPepper,DouglasPundick,BenRenow-Clarke,GwenanSpearing,MattWade,SteveWeissCoordinatingEditor:KevinWalterCopyEditor:SharonWilkeyCompositor:SPiGlobalIndexer:SPiGlobalArtist:SPiGlobalCoverDesigner:AnnaIshchenkoDistributedtothebooktradeworldwidebySpringerScience+BusinessMediaNewYork,233SpringStreet,6thFloor,NewYork,NY10013.
Phone1-800-SPRINGER,fax(201)348-4505,e-mailorders-ny@springer-sbm.
com,orvisitwww.
springeronline.
com.
ApressMedia,LLCisaCaliforniaLLCandthesolemember(owner)isSpringerScience+BusinessMediaFinanceInc.
(SSBMFinanceInc.
).
SSBMFinanceInc.
isaDelawarecorporation.
Forinformationontranslations,pleasee-mailrightsrights@apress.
com,orvisitwww.
apress.
com.
ApressandfriendsofEDbooksmaybepurchasedinbulkforacademic,corporate,orpromotionaluse.
eBookversionsandlicensesarealsoavailableformosttitles.
Formoreinformation,referenceourSpecialBulkSales–eBookLicensingwebpageatwww.
apress.
com/bulk-sales.
Anysourcecodeorothersupplementarymaterialreferencedbytheauthorinthistextisavailabletoreadersatwww.
apress.
com.
Fordetailedinformationabouthowtolocateyourbook'ssourcecode,gotowww.
apress.
com/source-code/.
Sohan,thisisforyou,myson.
Youhavebeenmyinspiration.
vContentsataGlanceAbouttheAuthorxxvAbouttheTechnicalReviewerxxviiAcknowledgmentsxxixIntroductionxxxiChapter1:ThinkingFunctionally1Chapter2:SeriesGeneration7Chapter3:TextProcessing49Chapter4:RefactoringwithLINQ89Chapter5:RefactoringwithMoreLINQ109Chapter6:CreatingDomain-SpecificLanguages123Chapter7:StaticCodeAnalysis151Chapter8:ExploratoryDataAnalysis165Chapter9:InteractingwiththeFileSystem195AppendixA:LeanLINQTips205AppendixB:TamingStreamingDatawithRx.
NET211Index231viiContentsAbouttheAuthorxxvAbouttheTechnicalReviewerxxviiAcknowledgmentsxxixIntroductionxxxiChapter1:ThinkingFunctionally11-1.
UnderstandingFunctionalProgramming11-2.
UsingFuncinC#toRepresentFunctions21-3.
UsingVariousTypesofFunctions2GeneratorFunctions3StatisticalFunctions3ProjectorFunctions3Filters31-4.
UnderstandingtheBenefitsofFunctionalProgramming4Composability4LazyEvaluation4Immutability4Parallelizable4Declarative51-5.
GettingLINQPad5ContentsviiiChapter2:SeriesGeneration72-1.
MathandStatistics:FindingtheDotProductofTwoVectors7Problem7Solution7HowItWorks82-2.
MathandStatistics:GeneratingPythagoreanTriples8Problem8Solution8HowItWorks92-3.
MathandStatistics:FindingaWeightedSum9Problem9Solution9HowItWorks102-4.
MathandStatistics:FindingthePercentileforEachElementinanArrayofNumbers10Problem10Solution10HowItWorks122-5.
MathandStatistics:FindingtheDominatorinanArray12Problem12Solution12HowItWorks132-6.
MathandStatistics:FindingtheMinimumNumberofCurrencyBillsRequiredforaGivenAmount13Problem13Solution13HowItWorks142-7.
MathandStatistics:FindingMovingAverages14Problem14Solution15HowItWorks15Contentsix2-8.
MathandStatistics:FindingaCumulativeSum16Problem16Solution16HowItWorks172-9.
RecursiveSeriesandPatterns:GeneratingRecursiveStructuresbyUsingL-SystemGrammar17Problem17Solution17HowItWorks182-10.
RecursiveSeriesandPatternsStep-by-StepGrowthofAlgae18Problem18Solution18HowItWorks192-11.
RecursiveSeriesandPatterns:GeneratingLogoCommandstoDrawaKochCurve20Problem20Solution20HowItWorks212-12.
RecursiveSeriesandPatterns:GeneratingLogoCommandstoDrawaSierpinskiTriangle21Problem22Solution22HowItWorks222-13.
RecursiveSeriesandPatterns:GeneratingFibonacciNumbersNonrecursively(MuchFaster)23Problem23Solution23HowItWorks242-14.
RecursiveSeriesandPatterns:GeneratingPermutations24Problem24Solution24HowItWorks25Contentsx2-15.
RecursiveSeriesandPatterns:GeneratingaPowerSetofaGivenSet26Problem26Solution26HowItWorks272-16.
Collections:PickingEverynthElement27Problem27Solution27HowItWorks282-17.
Collections:FindingtheLargerorSmallerofSeveralSequencesatEachIndex28Problem28Solution28HowItWorks302-18.
NumberTheory:GeneratingArmstrongNumbersandSimilarNumberSequences31Problem31Solution31HowItWorks332-19.
NumberTheory:GeneratingPascal'sTriangleNonrecursively34Problem34Solution35HowItWorks362-20.
GameDesign:FindingAllWinningPathsinanArbitraryTic-Tac-ToeBoard36Problem36Solution37HowItWorks382-21.
SeriesinGameDesign:SolvingGoFigure38Problem38Solution39HowItWorks40Contentsxi2-22.
MiscellaneousSeries:FindingMatchingPairsfromTwoUnsortedCollections41Problem41Solution41HowItWorks422-23.
MiscellaneousSeries:UsingaLookup-BasedApproach42Problem43Solution43HowItWorks432-24.
MiscellaneousSeries:SolvingtheFizzBuzzChallengeinaLINQOne-Liner44Problem44Solution45HowItWorks462-25.
MiscellaneousSeries:SolvingtheFizzBuzzChallengebyUsingSetTheory46Problem46Solution46HowItWorks47Summary48Chapter3:TextProcessing493-1.
SimulatingaT9WordSuggestion49Problem50Solution50HowItWorks513-2.
SimulatingaGestureKeyboard53Problem53Solution53HowItWorks543-3.
CloningPeterNorvig'sSpelling-CorrectionAlgorithm54Problem55Solution55HowItWorks57Contentsxii3-4.
ReversingaSentenceWordbyWord57Problem57Solution57HowItWorks583-5.
CreatingaWordTriangle58Problem58Solution58HowItWorks593-6.
FindingAnagrams59Problem59Solution59HowItWorks603-7.
CheckingforAnagramsWithoutSortingCharacters60Problem60Solution60HowItWorks613-8.
CreatingaRudimentaryProgrammingLanguageIdentifierandAutomaticSyntaxHighlighter62Problem62Solution62HowItWorks643-9.
CreatingaWord-LadderSolver66Problem66Solution66HowItWorks683-10.
FormattingontheFly69Problem69Solution70HowItWorks71Contentsxiii3-11.
SolvingEricLippert'sComma-QuibblingProblem71Problem72Solution72HowItWorks723-12.
GeneratingRandomSerials72Problem72Solution73HowItWorks733-13.
GeneratingAllSubstringsofaGivenString74Problem74Solution74HowItWorks753-14.
CreatingaScrabbleCheater75Problem75Solution75HowItWorks773-15.
FindingAlltheSubsequencesofaGivenString79Problem79Solution79HowItWorks803-16.
SqueezingaParagraphtoFillTightly82Problem82Solution82HowItWorks833-17.
PrintingtheLinesofaSong83Problem83Solution84HowItWorks85Contentsxiv3-18.
MiningAbbreviationsandFullFormsfromNewsArticles85Problem85Solution85HowItWorks86Summary87Chapter4:RefactoringwithLINQ894-1.
ReplacingLoopsbyUsingLINQOperators89AGeneralStrategytoTransformaLooptoaLINQQuery904-2.
TheAnyOperator91Problem91Solution91HowItWorks914-3.
TheAllOperator91Problem91Solution91HowItWorks914-4.
TheTakeOperator92Problem92Solution92HowItWorks924-5.
TheSkipOperator92Problem92Solution93HowItWorks934-6.
TheTakeWhileOperator93Problem93Solution93HowItWorks93Contentsxv4-7.
TheSkipWhileOperator94Problem94Solution94HowItWorks944-8.
TheWhereOperator95Problem95Solution95HowItWorks954-9.
TheZipOperator95Problem95Solution95HowItWorks964-10.
OrderByandOrderByDescendingOperators96Problem96Solution96HowItWorks974-11.
TheDistinctOperator97Problem97Solution97HowItWorks974-12.
TheUnionOperator98Problem98Solution98HowItWorks984-13.
TheIntersectOperator99Problem99Solution99HowItWorks99Contentsxvi4-14.
TheExceptOperator100Problem100Solution100HowItWorks1004-15.
TheConcatOperator101Problem101Solution101HowItWorks1014-16.
TheSequenceEqualOperator101Problem101Solution101HowItWorks1024-17.
TheOfTypeOperator103Problem103Solution103HowItWorks1034-18.
TheCastOperator103Problem103Solution103HowItWorks1034-19.
TheAggregateOperator104Problem104Solution104HowItWorks1044-20.
ReplacingNestedLoops105TheSelectManyOperator105RemovingNestedLoopsbyUsingSelectMany105ReplacingIf-ElseBlocksInsideaLoop106Contentsxvii4-21.
RunningCodeinParallelUsingAsParallel()andAsOrdered()Operators106Problem107Solution107HowItWorks108Summary108Chapter5:RefactoringwithMoreLINQ1095-1.
GettingMoreLINQ1095-2.
UsingtheScanOperator109Problem109Solution109HowItWorks1105-3.
UsingtheSliceOperator110Problem110Solution110HowItWorks1115-4.
UsingtheInterleaveOperator111Problem111Solution111HowItWorks1125-5.
UsingtheWindowedOperator113Problem113Solution113HowItWorks1145-6.
UsingtheCartesianOperator115Problem115Solution115HowItWorks115Contentsxviii5-7.
UsingthePartitionOperator116Problem116Solution117HowItWorks1185-8.
UsingtheIndexOperator118Problem118Solution119HowItWorks1195-9.
UsingthePairWiseOperator119Problem119Solution120HowItWorks1205-10.
TheForEachOperator121Problem121Solution121HowItWorks1215-11.
UsingtheMinBy/MaxByOperator122Problem122Solution122HowItWorks122Summary122Chapter6:CreatingDomain-SpecificLanguages1236-1.
FeeltheDifference1236-2.
CreatingaSimpleDSLforMathematicians124Problem124Solution124HowItWorks1286-3.
TestingArmstrongbyUsingNUnit129Problem129Solution129HowItWorks133Contentsxix6-4.
ExposingArmstrongasanExternalDSL133Problem133Solution134HowItWorks1396-5.
CloningHandyF#FunctionsbyUsingLINQ139Problem140Solution140HowItWorks1456-6.
LazilyGeneratingItemsfromaRecurrenceRelation146Problem146Solution147HowItWorks149Summary149Chapter7:StaticCodeAnalysis1517-1.
FindingVerboseTypeNamesinthe.
NET3.
5Framework151Problem151Solution151HowItWorks1527-2.
FindingtheNumberofOverloadsforaMethod152Problem153Solution153HowItWorks1547-3.
FindingtheSizeofaNamespace154Problem154Solution154HowItWorks1557-4.
FindingtheCode-to-Comment(C#Style)Ratio156Problem156Solution156HowItWorks157Contentsxx7-5.
FindingtheSizeofTypes158Problem158Solution158HowItWorks1597-6.
GeneratingDocumentationAutomatically159Problem159Solution159HowItWorks1607-7.
FindingInheritanceRelationships161Problem161Solution161HowItWorks1627-8.
LocatingComplexMethods162Problem162Solution163HowItWorks164Summary164Chapter8:ExploratoryDataAnalysis1658-1.
AnalyzingtheTitanicSurvivorsDataset165Problem166Solution166HowItWorks167Problem168Solution168HowItWorks1708-2.
ConvertingSurveyMonkeyResultstoCSV170Problem170Solution170HowItWorks172Contentsxxi8-3.
AnalyzingTrendsinBabyNames172Problem173Solution173HowItWorks1778-4.
AnalyzingStockValues177Problem177Solution177HowItWorks1798-5.
AnalyzingGitLogs179Problem180Solution180HowItWorks181Problem182Solution182HowItWorks1848-6.
AnalyzingMovieRatings184Problem185Solution185HowItWorks1878-7.
IdentifyingFlowersbyUsingMachineLearning191Problem191Solution191HowItWorks193Summary193Chapter9:InteractingwiththeFileSystem1959-1.
ComparingTwoCSVFiles195Problem195Solution195HowItWorks196Contentsxxii9-2.
FindingtheTotalFileSizeinaDirectory197Problem197Solution197HowItWorks1979-3.
CloningLINUXHeadandTailCommands197Problem198Solution198HowItWorks1999-4.
LocatingFileswiththeSameName(PossibleDuplicates)199Problem199Solution200HowItWorks2009-5.
FindingExact-DuplicateFiles200Problem200Solution200HowItWorks2019-6.
OrganizingDownloadsAutomatically201Problem201Solution201HowItWorks2029-7.
FindingFilesModifiedLastWeek202Problem202Solution203HowItWorks2039-8.
LocatingDeadFiles(FileswithZeroBytes)203Problem203Solution204HowItWorks204AppendixA:LeanLINQTips205Tip1205Explanation205ContentsxxiiiTip2205Explanation205Tip3206Explanation206Tip4206Explanation206Tip5206Explanation206Tip6206Explanation206Tip7207Explanation207Tip8207Explanation207Tip9207Explanation207Tip10207Explanation207Tip11208Explanation208Tip12208Explanation208Tip13208Explanation208Tip14208Explanation208Tip15209Explanation209Tip16209Explanation209ContentsxxivTip17209Explanation209AppendixB:TamingStreamingDatawithRx.
NET211ABriefExplanationoftheInterfaces213GettingRx.
NET213UsingRx.
NETinLINQPad213CreatingObservablesandSubscribing216Range216Repeat217Never217Interval217Generate217ToObservable219CreatingObservablesfrom.
NETEvents219Subscribe220CombiningObservableCollections220Concat220Merge221Amb223Zip223PartitioningObservables225Window225Time-TaggingObservables226Timestamp226TimeInterval227Rx.
NETShowcase228CreatingaSignatureCaptureScreen228LiveFileSystemWatcher229Summary230Index231xxvAbouttheAuthorSudiptaMukherjeeisanexperiencedprogrammer.
BorninShibpur,atownintheHowrahdistrictofWestBengalinIndia,hegrewupinBally,anothersmalltownintheHowrahdistrict.
HehasbeenworkingwithC#andLINQsincetheywerefirstreleased,andisanenthusiasticadvocateforLINQ.
Sudiptaisaprolificauthor,whosepreviousbooksincludeDataStructuresUsingC(http://goo.
gl/pttSh)and.
NET4.
0Generics:Beginner'sGuide(http://goo.
gl/LwVmZ5).
Hisinterestsaredatastructure,algorithms,textprocessing,machinelearning,naturallanguageprocessing,programminglanguages,andtoolsdevelopment.
Whennotworkingathisdayjoborwritingbooks,Sudiptalikesspendingtimewithhisfamilyandfollowinghispassionofsketchingandpainting.
SudiptalivesinBangaloreandcanbecontactedviae-mailatsudipto80@yahoo.
comoronTwitter@samthecoder.
xxviiAbouttheTechnicalReviewerFabioClaudioFerracchiatiisaseniorconsultantandasenioranalyst/developerusingMicrosofttechnologies.
HeworksatBluArancioSpA(www.
bluarancio.
com)asasenioranalyst/developerandMicrosoftDynamicsCRMSpecialist.
HeisaMicrosoftCertifiedSolutionDeveloperfor.
NET,aMicrosoftCertifiedApplicationDeveloperfor.
NET,aMicrosoftCertifiedProfessional,andaprolificauthorandtechnicalreviewer.
Overthepasttenyears,he'swrittenarticlesforItalianandinternationalmagazinesandcoauthoredmorethantenbooksonavarietyofcomputertopics.
xxixAcknowledgmentsAbooklikethiscan'tbepublishedwithoutcontinuoussupportfromthepublisher,editors,andthetechnicalreviewer.
IamverythankfultoJamesT.
DeWolfandKevinWalterofApressforbeingpatientandsupportive.
Ihadincrediblesupportfrommydevelopmenteditor,RussellJones.
IalsowanttothankFabioClaudioFerracchiatiforhisinvaluablehelpinreviewingandrunningeachandeveryprogramthatIwrote.
Thanksalot,gentlemen.
Anybodywhohaseverwrittenatechnicalbookwillprobablytellyouthatitisnoteasytofollowthispathuntiltheend.
Itrequiresalotofpatienceandsupport.
ThankstoGod,Ihavealotapatience.
AndIhadtremendoussupport,especiallyfrommywife,Mou,andeverybodyinmyfamily.
Thankyou,sweetheart!
Lastbutnotleast,IwanttothankGodonceagainforgivingmemylittleangel,Sohan.
Itissuchajoytobewithhim.
Ihavelearnedalotfromhim;hisperseveranceespeciallyhashelpedmeovercomesomeofmyownstumblingblocksinlife.
xxxiIntroductionThisbookwon'tteachyouthebasicsofLINQ.
Itwillteachyouhowtouseitappropriately.
Havingajackhammerisgreatonlyifyouknowhowtouseitproperly;otherwise,youarenotmuchbetteroffthansomeonewithahammer.
LINQispowerful.
Powerfulbeyondmeasure.
Ihopeyouwillseesomeofthatpowerbyfollowingtheexamplesinthebook.
Hereisabriefwalk-throughofthechapters:Chapter1:ThinkingFunctionallyOurgenerationofprogrammershasbeenraisedwithobject-orientedprogrammingideas.
Thisinitialchapterisdedicatedtoshowinghowfunctionalprogrammingisdifferentfromobject-orientedprogramming.
Thischaptersetsthecontextfortherestofthebook.
Chapter2:SeriesGenerationThischapterhasrecipesforgeneratingseveralseriesusingLINQ.
Forexample,itshowshowtogeneraterecursivepatternsandmathematicalseries.
Chapter3:TextProcessingTextprocessingisablankettermusedtocoverarangeoftasks,fromgenerationoftexttospell-checking.
ThischaptershowshowtouseLINQtoperformseveraltext-processingtasksthatareseeminglycommonplace.
Chapter4:RefactoringwithLINQLegacycodebasesgrow,andgrowfast—fasterthanyoumightthinktheywould.
Maintainingsuchhugecodeblockscanbecomeanightmare.
WhenisthelasttimeyouhadtroubleunderstandingwhatsomecomplexloopcodedoesThischaptershowshowtorefactoryourlegacyloopstoLINQ.
Chapter5:RefactoringwithMoreLINQMoreLINQisanopensourceLINQAPIthathasseveralmethodsforslicinganddicingdata.
SomeoftheseoperatorsareeasilycomposableusingotherLINQoperators.
Butsomearealsotrulyhelpfulinminimizingthetotalnumberofcodelines.
ThischaptershowshowyoucanbenefitfromusingMoreLINQ.
Chapter6:CreatingDomain-SpecificLanguagesUsingLINQDomain-specificlanguages(DSLs)aregaininginpopularitybecausetheyconveytheintentoftheprogrammerverynicely.
ThischaptershowshowtocreateseveralDSLs.
Chapter7:StaticCodeAnalysisLINQtreatseverythingasdata.
Codeisalsodata.
Thischaptershowshow,byusingLINQ-to-Reflection,youcandoalotofmetaprogrammingin.
NET.
IntroductionxxxiiChapter8:ExploratoryDataAnalysisThischaptershowshowyoucanuseLINQtosolveseveraldataanalysistasks.
Ihopeyoufindthischapterenjoyable,becausetheexamplesarereallyinteresting.
Chapter9:InteractionwiththeFileSystemIhavealwayswishedthatWindowsExplorerincludedbetterfeaturesforqueryingthefilesystem.
However,byusingLINQ,youcanbuildyourowncustomqueriesquickly.
Thischaptershowsyousomeexamplesthatcanbeusefulintherealworld.
AppendixA:LeanLINQTipsLINQisanAPIthatprovidesseveraloperatorstoexpressyourintent.
Althoughthatissuperpowerful,itcomeswithaprice.
Ifyoudon'tknowhowtheseoperatorsworkinternally,youmightendupusingacombinationthatresultsinslowercode.
Thisappendixprovidessomehard-earnedknowledgeabouthowtoglueLINQoperatorstogetherforoptimumperformance.
AppendixB:TamingStreamingDatawithRx.
NETBeingreactiveisimportantwhendealingwithstreamingdata.
Microsoft'süber-coolframework,Rx.
NET,isafantasticAPIfordealingwithstreamingdataandasyncoperations.
ThisappendixshowshowtouseRx.
NETtotacklestreamingdata.
6元虚拟主机是否值得购买?近期各商家都纷纷推出了优质便宜的虚拟主机产品,其中不少6元的虚拟主机,这种主机是否值得购买,下面我们一起来看看。1、百度云6元体验三个月(活动时间有限抓紧体验)体验地址:https://cloud.baidu.com/campaign/experience/index.html?from=bchPromotion20182、Ucloud 10元云主机体验地址:https:...
spinservers是一家主营国外服务器租用和Hybrid Dedicated等产品的商家,Majestic Hosting Solutions LLC旗下站点,商家数据中心包括美国达拉斯和圣何塞机房,机器一般10Gbps端口带宽,且硬件配置较高。目前,主机商针对达拉斯机房机器提供优惠码,最低款Dual E5-2630L v2+64G+1.6TB SSD月付89美元起,支持PayPal、支付宝等...
美国知名管理型主机公司,2006年运作至今,虚拟主机、VPS、云服务器、独立服务器等业务全部采用“managed”,也就是人工参与度高,很多事情都可以人工帮你处理,不过一直以来价格也贵。也不知道knownhost什么时候开始运作无管理型业务的,估计是为了扩展市场吧,反正是出来较长时间了。闲来无事,那就给大家介绍下“unmanaged VPS”,也就是无管理型VPS,低至5美元/月,基于KVM虚拟,...
syntaxhighlighter为你推荐
proprietaryios11主机routegeneratedgooglepreloadedbaidu思科ipad支持ipad更新iphoneC1:山东品牌商品馆ipad连不上wifiiPad mini WiFi开关成灰色无法连接,怎么办windows键是哪个Windows快捷键是什么
汉邦高科域名申请 174.127.195.202 好玩的桌面 免费博客空间 最好的空间 qq数据库下载 双拼域名 帽子云 老左来了 169邮箱 nerds phpmyadmin配置 空间技术网 smtp虚拟服务器 vul 中国电信测速网站 万网空间 免费稳定空间 阵亡将士纪念日 大化网 更多