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.
弘速云怎么样?弘速云是创建于2021年的品牌,运营该品牌的公司HOSU LIMITED(中文名称弘速科技有限公司)公司成立于2021年国内公司注册于2019年。HOSU LIMITED主要从事出售香港vps、美国VPS、香港独立服务器、香港站群服务器等,目前在售VPS线路有CN2+BGP、CN2 GIA,该公司旗下产品均采用KVM虚拟化架构。可联系商家代安装iso系统,目前推出全场vps新开7折,...
vollcloud怎么样?vollcloud LLC创立于2020年,是一家以互联网基础业务服务为主的 技术型企业,运营全球数据中心业务。VoLLcloud LLC针对新老用户推出全场年付产品7折促销优惠,共30个,机会难得,所有产品支持3日内无条件退款,同时提供产品免费体验。目前所有产品中,“镇店之宝”产品性价比高,适用大部分用户基础应用,卖的也是最好,同时,在这里感谢新老用户的支持和信任,我们...
LightNode是一家成立于2002年,总部位于香港的VPS服务商。提供基于KVM虚拟化技术.支持CentOS、Ubuntu或者Windows等操作系统。公司名:厦门靠谱云股份有限公司官方网站:https://www.lightnode.com拥有高质量香港CN2 GIA与东南亚节点(河内、曼谷、迪拜等)。最低月付7.71美金,按时付费,可随时取消。灵活满足开发建站、游戏应用、外贸电商等需求。首...
syntaxhighlighter为你推荐
三星itunesparticipants37平板ipad支持ipad支持ipad2.3ios5iphonewifi苹果手机怎么扫二维码连wifigoogle中国地图怎样用GOOLE搜中国地图用卫星看的那一种(可以看到城市和房子的)重庆电信宽带管家重庆电信宽带多少钱一个月谷歌sb为什么搜索SB第一个是google?
域名查询系统 vps是什么 westhost arvixe asp.net主机 omnis gitcafe godaddy域名证书 web服务器架设 大容量存储器 静态空间 cdn加速原理 东莞服务器 视频服务器是什么 www789 smtp服务器地址 什么是web服务器 php服务器 数据湾 酷锐 更多