|
|
|
|
Kategorier:
Min blogg
Windows Server
Konfiguration
|
|
Bloggen är tillbaka efter lång nedtid
Felet var inte särskilt dramatiskt - jag bytte helt enkelt DNS-servrar för att hantera mina domännamn, och på grund av
tidsbrist tog det bytet betydligt längre tid än planerat. Domänen tednyberg.com pekade helt enkelt fel ett antal
veckor. Ber om ursäkt. Som plåster på såren blir detta inlägg en kort introduktion till DNS och domänhantering! :)
Vad gör att en domän visar rätt webbplats?
För de flesta webbutvecklare är det här självklarheter, men för många andra är det mindre självklart hur en domän
uppstår och sedan pekar mot rätt webbplats på internet. Följande delar utgör infrastrukturen som får ett domännamn att fungera för en viss webbplats:
- En domänregistrerare (domain registrar), exempelvis .SE
- En eller flera DNS-servrar
- En webbserver med ett publikt IP-nummer
Så fungerar det
Först registrerar man domänen genom en domain registrar. För den svenska toppdomänen .se är det Stiftelsen för Internetinfrastruktur som gäller. Därigenom kan alla
registrerade ombud registrera nya domäner inom .se-toppdomänen.
När domänen är registrerad kan man som domänägare konfigurera vilka name servers, eller DNS-servrar, som domänen
ska använda. Dessa har till uppgift att berätta var en domän ska peka någonstans. När ett uppslag görs mot domänen,
exempelvis för att den anges i adressfältet i en webbläsare, görs ett uppslag mot DNS-servrarna som säger var domänen pekar
någonstans.
Lite mer om DNS-servern
DNS-servern har information om var en domän, eller subdomäner inom den, ska peka någonstans. Varje sådan pekning utgörs
av ett record i DNS-servern. Det finns ett antal olika typer:
- A record, pekar ut en IP-adress
- CNAME, pekar ut en annan domän
- MX record, anger e-postinställningar
Exempel på DNS-pekningar
Låt oss säga att vi har domanen nagondoman.se registrerad. Vi anger via .SE:s administrationsgränssnitt att
denna domän ska använda DNS-servern nagondns.se. För vår domän har vi en webbplats, en FTP-server samt en
e-postserver, exempelvis Microsoft Exchange.
Vi lägger upp ett A record för subdomänen www.nagondoman.se i DNS:en och anger vår webbservers
IP-adress. Vi lägger till ytterligare ett A record för subdomänen ftp.nagondoman.se men anger istället vår
FTP-servers IP-adress. Därefter lägger vi upp ett MX record för nagondoman.se och anger IP-adressen till vår e-postserver.
Resultatet av våra 'DNS entries'
När man skriver in adressen www.nagondoman.se i webbläsaren kommer denna att visa den webbplats som levereras av
den webbserver vars IP-adress har angivits för subdomänen "www" i DNS:en. I min FTP-klient, exempelvis FileZilla, kan jag ange ftp.nagondoman.se som adress och då
ansluta till den server vars IP-adress har angivits för subdomänen "ftp" i DNS:en. Slutligen kan jag mejla till
vadsomhelst@mindoman.se och få dessa mejl att hanteras av e-postservern vars IP har lagts upp som MX record
på DNS-servern.
Kort om host headers
Vanligtvis hanterar en webbserver flera olika webbplatser. För att få rätt webbplats av webbservern när man skriver in
domännamnet räcker det således inte att få domänen att peka mot rätt IP-adress. Den IP-adressen används ju av flera
olika webbplatser. Hur man löser detta beror på vilken webbserver man använder, men principen är vanligtvis densamma. I Microsoft IIS anger man ett eller flera så kallade host headers för
varje webbplats. När webbservern får ett request från internet kontrollerar den vilken domän som har använts och
använder denna för att leverera innehåll för rätt webbplats. I det här fallet skulle vi alltså gå in i
administrationsverktyget för IIS och där konfigurera
host-namnet www.nagondoman.se för vår webbplats.
|
|
|
|
|
|
|
|
Kategorier:
EPiServer
|
|
Blogg för dig som utvecklar EPiServer-webbplatser
Om du utvecklar webbplatser med EPiServer kan du vara intresserad av min EPiServer-blogg på labs.episerver.com/tednyberg.
Samling av bloggar om EPiServer
På labs.episerver.com finns ett antal bloggar om EPiServer samlade. För egen del är dessa bloggar att föredra framför forum.
P.S Borde inte subdomänen blogs.episerver.com också läggas upp? D.S
|
|
|
|
|
|
|
|
Kategorier:
Umbraco
CMS
|
|
|
I slutet av december började en holländare vid namn Ruben Verborgh att implementera ett nytt datalager för Umbraco för att möjliggöra
MySQL som datakälla. Idag laddade jag ned senaste changeset:et för Umbraco från CodePlex för att börja experimentera med det. Målet var att
kunna använda MySQL istället för SQL Express som datakälla för att på så sätt kunna använda vanliga webbhotell för hosting.
Umbraco stöder nu MySQL
Dansken Niels Hartvig, upphovsmannen bakom Umbraco, har tagit in Ruben i deras "core team" och sett till att
stöd för MySQL numera ingår i den källkod som checkas in på CodePlex.
Enklast är att ladda ner senaste changeset:et, öppna det
i Visual Studio 2005 och därefter köra igång! Det som är "själva webbplatsen" är projektet umbraco.presentation. Om du har använt
Umbraco tidigare kommer du att märka att det nu är möjligt att ange en connection string för en MySQL-databas i web.config:
<add key="umbracoDbDSN" value="DataLayer=MySQL; Server=MYSERVER; Database=MYDATABASE; User ID=MYUSERNAME; Password=MYPASSWORD;" />
Installation görs fortfarande på samma sätt
Jag har tidigare skrivit ett inlägg om hur man kommer igång med Umbraco, och detta
gäller även om man använder MySQL som databas. Enda skillnaden är att man skapar den tomma databasen i MySQL istället för i SQL Express. Tänk dock på
att den senaste releasen av Umbraco (3.0.3) inte stöder MySQL. Stöd i ordinarie release kommer att finnas från och med version
3.1 som enligt Niels ska släppas någon gång i mars.
Nu vet vi att det fungerar
Jag har idag smärtfritt migrerat ett projekt från SQL Express till MySQL. Detta gick kortfattat ut på att jag skrev en liten kodsnutt som gick
igenom samtliga tabeller i den tidigare SQL Express-databasen och kopierade över alla poster till MySQL-databasen (jag struntade i MySQL:s
migreringsverktyg).
|
|
|
|
|
|
|
|
Kategorier:
.NET
|
|
Ett litet tips om du återanvänder klassnamn
I ett mindre ramverk jag arbetar med härmar jag namespace-strukturen i .NET för att göra det enkelt att hitta ärvda klassimplementationer.
Exempelvis ligger klassen TextBox i namespace System.Web.UI.WebControls. Min ärvda (och självklart fantastiskt mycket bättre) TextBox-klass ligger i namespace MittRamverk.Web.UI.WebControls. Du ser mönstret?
Eftersom jag endast har gjort ärvda varianter av vissa klasser vill jag ha med följande i min källkod för att enkelt kunna använda basklasserna:
using System.Web.UI.WebControls;
För att kunna använda mina ärvda klasser skulle jag vilja lägga till:
using MittRamverk.Web.UI.WebControls;
Vilken klass menar man?
Om jag nu i min kod försöker referera till klassen TextBox kommer jag att få ett kompileringsfel eftersom klassnamnet påträffas i fler än ett namespace.
En potentiell lösning är att alltid skriva ut hela namespace-deklarationen när jag vill använda min ärvda TextBox-klass:
MittRamverk.Web.UI.WebControls.TextBox minTextRuta = new MittRamverk.Web.UI.WebControls.TextBox();
Helt smidigt är det ju inte, särskilt inte om jag ofta vill skapa nya TextBox-instanser.
Skapa genvägar till långa namespace
Genom att använda följande syntax kan jag göra det betydligt enklare att referera till mitt eget namespace och på så sätt specificera vilken variant av TextBox-klassen det är jag vill använda:
using TED = MittRamverk.Web.UI.WebControls;
Nu kan jag enkelt referera till min egen ärvda TextBox-klass genom att använda följande syntax:
TED.TextBox minTextRuta = new TED.TextBox();
|
|
|
|
|
|
|
|
Kategorier:
.NET
Dokumentation
API/SDK
|
|
Förhindra att utdaterade klasser används
Om du utvecklar någon form av ramverk, eller om du helt enkelt vill hålla dig till goda
dokumentationsprinciper, kan det vara en god idé att använda Obsolete-attributet för att
markera gamla klasser som utdaterade. På detta sätt kan du varna vid, eller till och med förbjuda,
användning av klasser som ej längre anses vara aktuella.
Så använder du attributet Obsolete
Det finns tre olika overloads för Obsolete-attributet. Detta ger dig tre olika
alternativ:
- Markera en klass som obsolete, eller deprecated
- Markera en klass som obsolete med ett specifikt meddelande
- Som ovan, men försök att använda klassen ger ett kompileringsfel
Så här ser det ut i källkoden:
/// <summary>
/// Min gamla klass
/// </summary>
[Obsolete("Den här klassen är gammal!",true)]
public class PreviewLinkFilter : Stream
{
[...]
Nu får vi en varning i källkoden när vi försöker att använda den gamla klassen. I exemplet har jag
angivit en förklaring och motivering till varför klassen numera är deprecated:
Den andra parametern i Obsolete-attributet är satt till true, vilket innebär att
klassanvändning ska betraktas som ett fel och därför förhindra kompilering. Om vi försöker
kompilera koden får vi därför följande kompileringsfel:
|
|
|
|
|
|
|
|
Kategorier:
EPiServer
|
|
Förhindra URL-omskrivning för specifika sidor
Jag implementerade nyligen en .ashx-handler för en webbplats med EPiServer CMS. Det jag märkte var att om jag skapade en länk till denna handler så blev länkningen fel på grund av EPiServers URL-omskrivning.
Skapa undantag för URL-omskrivningen
Lösningen var att undanta URL:en till handlern från URL-omskrivning. Detta gjorde jag genom att lägga till undantaget i Application_Start i global.asax:
protected void Application_Start(Object sender, EventArgs e)
{
FriendlyUrlRewriteProvider.UnTouchedPaths.Add( "/Modules/vCard.ashx");
}
FriendlyUrlRewriteProvider-klassen ligger i namespace EPiServer.Web.
|
|
|
|
|
|
|
|
Kategorier:
Min blogg
|
|
|
Nu när årets första inlägg har publicerats ser jag att det inte är möjligt att byta år i högerkolumnen för att se äldre inlägg per månad.
Detta åtgärdas inom kort! :)
|
|
|
|
|
|
|
|
Kategorier:
EPiServer
|
|
|
Jag stötte på ett intressant problem när jag skulle kontrollera om en viss sida var publicerad i EPiServer CMS. Jag trodde att det skulle räcka att kolla om Page.Status == VersionStatus.Published, men tji fick jag.
Status-egenskapen är alltid VersionStatus.Published
Status-egenskapen för en sida har alltid värdet VersionStatus.Published. EPiServer Support rapporterar att dom såg samma resultat när de testade. Oklart varför dock.
En möjlig workaround
I mitt fall löste jag problemet genom att kolla om egenskapen PendingPublish var false samt om egenskaperna StartPublish och StopPublish var mindre respektive större än DateTime.Now. Detta sammantaget gjorde det möjligt att se om en sida faktiskt var publicerad och synlig.
|
|
|
|
|
|
|
|
Kategorier:
ASP.NET
EPiServer
|
|
Cannot get IIS pickup directory
Detta felmeddelande kan exempelvis uppstå när du försöker att skicka e-post via SMTP genom att använda klasserna i namespace System.Net.Mail.
Det kan finnas många förklaringar till detta, men en orsak jag nyligen stötte på var att det saknades en lokal SMTP-server samtidigt som webbapplikationen var konfigurerad att använda leveransmetod pickupDirectoryFromIis (detta gäller exempelvis EPiServer CMS som har detta som standardinställning).
Så löste jag det
Jag löste problemet genom en enkel ändring i web.config:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" />
<mailSettings>
<system.net>
Observera att det måste vara ett stort "N" i Network. Möjliga alternativ för deliveryMethod är:
- PickupDirectoryFromIis
- Network
- SpecifiedPickupDirectory
|
|
|
|
|
|
|
|
Kategorier:
Umbraco
CMS
|
|
|
Om du får ett felmeddelande om att det ej går att ansluta till en SQL Express-databas när du installerar en ny Umbraco-webbplats kan det bero på att SQL Express som standard endast tillåter Windows-autentisering.
För att lösa problemet startar du Management Studio Express, högerklicka därefter på servernamnet (vanligtvis högst upp i trädstrukturen) och välj sedan Properties. Gå sedan in under Security och välj SQL Server and Windows authentication mode. När du är klar stänger du dialogrutan, högerklickar på servernamnet igen och väljer sedan Restart.
Nu ska allt fungera fint förutsatt att det SQL-konto som anges har owner-rättigheter till databasen!
|
|
|
|
|
|
|
|
Kategorier:
Umbraco
CMS
|
|
|
För att använda flat URL i Umbraco måste du ändra inställningen umbracoUseDirectoryUrls under
appSettings i web.config. Sätt denna till true. URL:er kommer från och med nu, istället för att se ut som http://minsida.org/min-sida.aspx, se ut så här:
http://minsida.org/rotsida/undersida/min-sida
Wildcard mapping i IIS
Eftersom ovan nämnda inställning gör så att URL:er omskrivs utan tillägget .aspx måste man lägga till en
wildcard mapping i IIS så att ASP.NET kan
processa anrop mot en flat URL.
Starta konsollverktyget för IIS och gå därefter in på Properties för webbplatsen. Gå sedan in under
Directory-fliken och klicka därefter på Configuration. Under Mappings-fliken klickar du sedan på
Add. Ange inställningar enligt skärmdumpen nedan (den visar hur det ser ut på Windows XP med IIS 5.1) och klicka
därefter på OK.
Observera! Det finns en liten bugg i IIS:en som kan leda till att OK-knappen fortfarande är inaktiverad trots att du har angivit inställningarna korrekt. Efter att du har navigerat till exempelvis aspnet_isapi.dll kommer sökvägen att visas komprimerad i textrutan. Klicka då i textrutan, efter det kommer den fullständiga sökvägen att visas och OK-knappen kommer att aktiveras. Var också noga med att skriva .* som extension.
Uppdatering: Var också noga med att avmarkera "Check that file exists", de URL:er som presenteras av Umbraco har ju inga motsvarande fysiska filer!
Uppdatering #2: Efter att du har aktiverat flat URL måste du använda http://minsida.org/umbraco/default.aspx för att komma åt administratörsläget!
|
|
|
|
|
|
|
|
Kategorier:
Umbraco
CMS
|
|
|
Om du har öppnat mappen för din Umbraco-webbplats i Visual Studio 2005/2008 kommer du säkerligen att stöta på ett kompileringsfel som säger att typen NodeService ej kan skapas.
Jag gör inga anspråk på att förstå varför. Jag gör ej heller några anspråk på att veta vad följderna blir av att använda sig av följande workaround, men än så länge fungerar allt fint för mig efter att jag exkluderat NodeService.asmx från projektet.
I Visual Studio, gå till mappen Umbraco, därefter mappen webservices. Högerklicka på filen NodeService.asmx och välj sedan Exclude from project.
Nu bör du kunna kompilera projektet! Anslut debuggern till ASPNET-processen för att kunna stega igenom din kod!
|
|
|
|
|
|
|
|
Kategorier:
Umbraco
CMS
|
|
Vad är Umbraco?
Umbraco är ett gratis CMS-verktyg som bygger på ASP.NET. För den som inte känner till begreppet CMS står det för Content Management System och översätts ofta med publiceringsverktyg. Det är kort och gott ett system för att låta redaktörer underhålla och publicera innehåll på webbplatser.
Vad du behöver för att komma igång
Följande bör du ha på plats för att komma igång:
- Internet Information Services (IIS)
- SQL Server 2005/SQL Express
- Visual Studio 2005/2008
Ladda ned Umbraco
Börja med att ladda ned Umbraco från www.umbraco.org/download. Observera att det finns en länk under formuläret för att ladda ned Umbraco utan att registrera sig. Eftersom den automatiska installationsfilen endast fungerar på Vista/Server 2003 har jag utgått ifrån det manuella installationsförfarandet.
Packa upp den nedladdade filen till en lokal mapp. Skapa en webbplats i IIS som pekar på samma mapp. Glöm inte att lägga till dokumenttypen default.aspx under Documents-fliken samt att konfigurera webbplatsen som en ASP.NET 2.0-applikation.
Skapa en SQL-databas
Skapa en tom databas genom Management Studio eller motsvarande. Du behöver inte lägga till några tabeller eller liknande, detta görs längre fram av Umbraco självt. Du behöver däremot lägga till ett SQL-konto som får fulla rättigheter till databasen. Notera databasnamnet, användernamnet och lösenordet. Du kommer snart att behöva dom.
Sätt upp filrättigheter
Se till att ASPNET- och IUSR-kontona har läsrättigheter till samtliga Umbraco-mappar och -filer. ASPNET-kontot måste även ha skrivrättigheter till ett antal av Umbraco-mapparna. Lägg därför till behörigheterna write och modify för ASPNET-kontot till följande mappar:
- /bin
- /config
- /css
- /data
- /media
- /umbraco
- /usercontrols
- /xslt
Konfigurera databasinställningarna
Öppna upp web.config i mappen du skapade tidigare och leta upp inställningen umbracoDbDSN i appSettings-sektionen. Modifiera anslutningssträngen så att den överensstämmer med de uppgifter du använde när du skapade databasen tidigare. Den bör därefter se ut ungefär så här:
<add key="umbracoDbDSN" value="Server=127.0.0.1;Database=minDatabas;User ID=mittAnvandarNamn;Password=mittLosenord;Trusted_Connection=False" />
Starta installationen
Surfa till den webbplats du tidigare lade upp i IIS. Du kommer då att få se Umbracos installationsguide. Om du följt de tidigare anvisningarna bör det räcka med att klicka Next till du kommit igenom installationen. Du kommer då att hamna vid en inloggningsruta där du loggar in med användarnamnet admin och det lösenord du valde under installationsprocessen.
Uppdatering: Efter att du är färdig med installationsprocessen måste du gå in i web.config igen och ändra inställningen umbracoConfigurationStatus under appSettings till rätt versionsnummer. I skrivande stund innebär detta att värdet för denna inställning ska vara "3.0.3".
|
|
|
|
|
|
|
|
Kategorier:
SQL
|
|
|
För andra gången har jag stött på ett problem som uppstår när man avbrutit åtgärden "Take offline" för en databas i SQL Server 2005. Men - denna gången fann jag även lösningen!
Problemet uppstår när man har valt "Take offline" för en databas men sedan avbrutit åtgärden. Databasen är då ej längre tillgänglig i Management Studio, och det går ej heller att välja alternativet "Bring online". Försöker man gå in under "Properties" får man ett felmeddelande som innehåller "Error 952, Database is in transition".
Lösningen är lika enkel som den är ologisk: starta om Management Studio på klienten.
Efter detta är databasen oftast offline. Om du vill ha igång den igen är det bara att välja "Bring online". Annars kan du göra det som du hade tänkt göra när du plockade ned databasen från första början! :)
|
|
|
|
|
|
|
|
Kategorier:
Visual Studio
|
|
|
Då var det äntligen dags! Microsoft har släppt Visual Studio 2008 och .NET 3.5! Lite väl hög nördfaktor att likna känslan vid att vara barn på julafton, men spännande är det!
Läs mer om det på Scott Guthries blog här! Han har gjort en sammanställning av några av de viktigaste nyheterna i Visual Studio 2008 (tidigare "Orcas").
|
|
|
|
|
|
|
|
Kategorier:
.NET
|
|
|
Jag finner ofta att jag behöver implementera logik som är beroende av alfabetet. I de fallen använder
jag ofta följande metod för att få en array med alfabetet:
///<summary>
///Gets a char array with the alphabet
///</summary>
///<param name="Swedish">
///Specifies whether Sweden-specific characters should be included
///</param>
///<param name="UpperCase">
///Specifies if the array should be in upper or lower case
///</param>
///<returns>An alphabet array</returns>
public static char[] GetAlphabet(bool Swedish, bool UpperCase)
{
string alphabet = string.Concat("abcdefghijklmnopqrstuvwxyz",
(Swedish
? "åäö" : string.Empty));
if (UpperCase)
return alphabet.ToUpper().ToCharArray();
else
return alphabet.ToCharArray();
}
Sådär, nu kanske de som söker på "alphabet array" kan få en relevant träff! :)
|
|
|
|
|
|
|
|
Kategorier:
EPiServer
|
|
Använd GetChildren för att hämta undersidor
Det är inte ovanligt att man plockar ut sidor i EPiServer CMS genom att anropa GetChildren-metoden.
Exempelvis kan följande användas för att hämta alla undersidor under den aktuella sidan:
PageDataCollection undersidor =
EPiServer.DataFactory.Instance.GetChildren(CurrentPage.PageLink);
Om vi vill sortera vår PageDataCollection måste vi använda en klass som ärver från interface
IComparer.
Sortera sidor efter publiceringsdatum
Följande klass kallad PageDateSorter kan användas för att sortera ett PageDataCollection-objekt efter publiceringsdatum:
public class PageDateSorter : IComparer
{
private bool useReverseOrder;
///<summary>
///Used to instantiate a default sorter for ascending sort order
///</summary>
public PageDateSorter()
{
useReverseOrder = false;
}
///<summary>
///Used to instantiate a sorter with either
///ascending or descending sort order
///</summary>
public PageDateSorter(bool SortDescending)
{
useReverseOrder = SortDescending;
}
int IComparer<PageData>.Compare(PageData x, PageData y)
{
if (!useReverseOrder)
x.StartPublish.CompareTo(y.StartPublish); //Ascending
else
y.StartPublish.CompareTo(x.StartPublish); //Descending
}
}
Nu kan vi sortera ett PageDataCollection-objekt i fallande ordning genom att skriva:
undersidor.Sort(new PageDateSorter(true));
|
|
|
|
|
|
|
|
Kategorier:
.NET
|
|
|
Det är inte ovanligt att man vill presentera en del av en text, exempelvis inledningen av en nyhet, på
en webbplats startsida eller i en listning. Ofta ser man att substring-metoden använts med ett
godtyckligt antal tecken. En kort text får man då, men snyggt blir det inte (såvida inte slumpen spelar en
i händerna).
En betydligt bättre variant är att simulera lite AI för att få textklippningen att se medveten ut.
Detta åstadkommer vi genom att:
- Se till att aldrig klippa mitt i ett ord
- Lägg till tre punkter om texten bryts i en mening
Följande metod kallad TruncateText gör precis detta. Notera variabeln stopChars som avgör vilka
tecken som ska anses vara meningsbrytande. Koden saknar kommentarer,
men bra kod är självförklarande eller hur var det nu? Det finns utrymme för förbättringar i en den här metoden, men
den löser de vanligaste behoven.
public static string TruncateText(string OriginalText,
int MaxCharacters)
{
string stopChars = " .!?";
if (OriginalText.Length > MaxCharacters)
{
string stringToReturn = OriginalText.Substring(0, MaxCharacters);
while (!stopChars.Contains(stringToReturn.Substring
(stringToReturn.Length-1)) && stringToReturn.Length>0)
{
stringToReturn = stringToReturn.Substring(0,
stringToReturn.Length - 1);
}
if (stringToReturn.Length == 0)
stringToReturn = OriginalText.Substring(MaxCharacters);
stringToReturn = stringToReturn.Trim();
if(!stopChars.Contains(stringToReturn.Substring
(stringToReturn.Length-1)))
{
stringToReturn += "...";
}
return stringToReturn;
}
else
{
return OriginalText;
}
}
|
|
|
|
|
|
|
|
Kategorier:
EPiServer
|
|
Varför får man detta felmeddelande i EPiServer?
En trolig orsak är att det är något fel i en av dina språkfiler, exempelvis lang.xml eller motsvarande.
Jag har upptäckt att om man försöker använda CDATA i dessa XML-filer i EPiServer CMS så får man just felmeddelandet "No ID attribute on language node".
|
|
|
|
|
|
|
|
Kategorier:
Grundläggande koncept
.NET
|
|
|
Jag har tidigare skrivit om hur man använder generics för att skapa typsäkra listor. Där beskrev jag även hur man får till sortering. Jag tänkte komplettera det inlägget med en beskrivning av hur man ordnar slumpmässig sortering, det vill säga en Randomize()-metod för List-objekt av generic-typ.
Lösningen finns i interface IComparer
Hemligheten är att skapa en klass som ärver IComparer-interface:et. För att slumpmässigt sortera en generics-lista med string-objekt (detta kan dock vara vilken typ som helst, även egenskapade) skapade jag följande klass:
public class RandomSorter : IComparer<string>
{
public int Compare(string x, string y)
{
int seed = int.Parse(DateTime.Now.Ticks.ToString().Substring(16));
Random rnd = new Random(seed);
if((rnd.NextDouble()*10)%2==0)
return -1;
else
return 1;
}
}
Följande exempel visar hur RandomSorter-klassen används för att slumpmässigt sortera en lista med strängar:
public static void PrintRandomList()
{
List<string>myStrings = new List<string>();
myStrings.Add("Första");
myStrings.Add("Andra");
myStrings.Add("Tredje");
myStrings.Add("Fjärde");
myStrings.Add("Femte");
myStrings.Sort(new RandomSorter());
foreach (string s in myStrings)
Console.WriteLine(s);
}
Och så här blir resultatet:
|
|
|