Michells Mesterværk

Debugging IE8 crash dumps

by Administrator 29. December 2009 11:55

Det sker heldigvis ikke ofte at min IE8 crasher, men nogle gange kan det alligevel godt ske. Det er mega træls at blive ramt at browser crash, især når jeg bruger megat af min tid i en browser.

Hvis man gerne vil dykke lidt mere ned i hvad ens IE crash skyldes, så kan man nemt gøre det ved disse 6 steps.

1. Installer “Debugging tools for windows” http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx

2. Opret en folder der hedder c:\adplus

3. Åben IE8

4. Åben en administrator command prompt og ændre stien til det sted du har installeret “Debugging tools for windows” (default: C:\Program Files\Debugging Tools for Windows)

5. Indtast følgende i den åbnede command prompt og tryk derefter ENTER: cscript adplus.vbs -crash -pn iexplore.exe -quiet -o c:\adplus 

6. Reproducer dit crash

Når din browser crasher skulle der meget gerne “fødes” noget data i din adplus mappe. De .dmp file(r) der ligger i mappen er ofte nok til at finde frem til det der måtte være årsagen til dit crash.

Udover ovenstående vil jeg forslå at du sætter dig en smule ind i adplus som er en del af de tools du installere i step 1. Du finder en debuggers.chm fil i installations mappen hvor du kan læse mere om adplus.

Tags:

Vinderen af den sidste låge i julekalenderen. God jul!

by Administrator 23. December 2009 13:18

Selvom ingen svarede helt rigtigt på det første spørgsmål, så var der alligevel mange af jer der faktisk gav et andet gyldigt svar.

I Japan er der udgivet 2 produkter til Microsoft Office. Det ene hedder InterConnect og det andet, som var det rigtige svar, hedder Hagaki Studio. Et trickspørgsmål om man vil!

Anyways, flere havde svaret InterConnect, og det godtager jeg som et korrekt svar. Rune Juhl-Petersen havde dog trods alt, formuleret med sine egne ord, hvad forskellen på de nye VS2010 SKUer er i forhold til dem i VS2008. Ingen af jer andre havde formået at gøre det samme. Derfor går sejren til Rune. Tillykke!

Det kan kort og godt siges på følgende måde.

clip_image001[4]

jeg vil samtidig gerne ønske jer allesammen en mega god jul. Vi ses på den anden side!

Tags:

Failed Request Tracer i IIS 7.x og FailedRequestViewer

by Administrator 22. December 2009 11:18

Med IIS 7.x har man mulighed for at trace fejlede requests. Det er smart hvis man oplever at mange requests simpelthen fejler, smider en exception eller evt. udløber. Request tracing efterlader en form for log fil hver gang et request fejler, og de log filer kan man enten gennemgå manuelt eller igennem det jeg har valgt at bygge til formålet – FailedRequestViewer.

Du kan sætte failed request tracer regler på, enten på din webserver (IIS) eller igennem din applikation. Jeg kan så godt lide at fortælle at man har mulighed for at manipulere med IISn igennem applikationens web.config fil, at jeg i dette eksempel simpelthen vil vise hvordan det gøres.

Du kan logge alt hvad mht. fejlede requests ved at indsætte følgende i din web.config fil:

<system.webServer>
<tracing>
<traceFailedRequests>
<add path="*">
<traceAreas>
<add provider="ASP" verbosity="Verbose" />
<add provider="ASPNET"
areas="Infrastructure,
Module,
Page,
AppServices"
verbosity="Verbose" />
<add provider="ISAPI Extension" verbosity="Verbose" />
<add provider="WWW Server"
areas="Authentication,
Security,
Filter,
StaticFile,
CGI,
Compression,
Cache,
RequestNotifications,
Module,
FastCGI"

verbosity="Verbose" />
</traceAreas>
<failureDefinitions timeTaken="00:00:00" statusCodes="100-999" />
</add>
</traceFailedRequests>
</tracing>
</system.webServer>

Det er faktisk meget simpelt. Her specificere vi hvilke providers vi gerne vil trace på, og hvilke areas vi ønsker at få information om. I vores failuredefinitions element fortæller vi, at vi gerne vil logge de requests som løber imellem statuskode 100 til 999 (alt).Husk at vi her kun fejlede requests, ikke requests der er “korrekt” gennemført.
 
Ens failed request log filer bliver pr. default gemt under inetpub (C:\inetpub\logs\FailedReqLogFiles\XXX\) folderen på webserveren. De er rene XML filer og sammen med dem ligger der et XSLT stylesheet der benyttes når man ser disse XML log filer i ens browser.
 
failed

Se det er rigtigt super mega smart. Dette giver os nemlig mulighed for at finde ud af rigtig mange ting omkring de requests der har fejlet. Dog er der en ting som ikke er optimal ved dette, nemlig at man pr. default skal gennemgå de her logfiler en efter en. Det holder ikke. Derfor jeg er gået igang med at bygge en oversigt til de her filer, så man får et mere nuanceret overblik over ens failed request filer og i fremtiden måske bruge oversigten til lettere at finde fejl i ens applikation.

files

og flere detaljer om hvert request

error

Du kan downloade koden for projektet her.

Tags:

ASP.NET | Udvikleren.dk | VS2010

Mr. Frosts Julekalender – den sidste låge

by Administrator 21. December 2009 14:03

Det har været en god gang julekalender i år, også selvom jeg ikke har haft båndbredde til at have alle låger klar osv. Men det er bedre end ingenting!

Denne gang afslutter vi julekalenderen med en serie af spørgmål som du skal svare så rigtigt på som muligt.

1. I Japan, og kun i Japan, har MIcrosoft udgivet et produkt som bla. omtales i 2 videoer på Channel9. Brugeren der har uploadet videoerne finder du her: http://channel9.msdn.com/posts/c9Japan/. Hvad hedder produktet ?

2. Henrik Lykke Nielsen har en Microsoft titel, også selvom han ikke er ansat, men hvad er titlen ?

3. Visual Studio 2010 “stock keeping-unit (SKU)” er lavet om, men hvad hedder de nye og hvad dækker de over i forhold til dem før version 2010.

Vinderen får de ting jeg har tilbage i min julesæk :)

IMAGE_078

Denne låge køre frem til d. 23 kl. 12:00

Tags:

Mr. Frosts Podcast Show #12 – Hvordan bygger man en profiler ?

by Administrator 18. December 2009 12:46

Richard Flamsholt arbejder til dagligt i Linkage A/S som leverer industrielle software løsninger bygget på bla. Microsoft .NET Compact Framework. Udover at være ansat som udvikler i Linkage A/S har Richard også været en af drivkrafterne bag søsterselskabets (EQATEC A/S) udvikling af en profiler til bla. Compact Frameworket samt Silverlight. Sidstnævnte profiler er dog ikke offentlig endnu.

Hør Richard og jeg snakke om hvordan man bygger en profiler, hvorfor man skal bruge en og hvordan EQATEC A/S selv har profilet profileren.

God fornøjelse

Tags:

Mr. Frosts julekalender – låge 17.

by Administrator 17. December 2009 09:25

Husk at læse de praktiske småting.

Opgaven for låge 17 går ud på at lave en file-upload progress-bar, enten client-side med Jquery eller server-side med ASP.NET.

Altså, når brugeren har submitted en fil til upload, så skal der vises en progress-bar der fortæller hvor langt i upload forløbet man er.

Præmien idag er et par kilo bolscher.

image

Tags:

Vinderen af Låge 15

by Administrator 17. December 2009 09:13

Tillykke til Niklas Christoffer Petersen for sit rigtige fede bidrag til låge 15.

Her er en del af den kode som Niklas har skrevet.

private void CreateDays()
{
HtmlGenericControl days = new HtmlGenericControl("div");
days.Attributes.Add("class", "days");

/* Tilføj tomme dage så det passer :0) */
DateTime date = SelectedDate.AddDays(-SelectedDate.Day);
date = date.AddDays(
        (int)CultureInfo.CurrentUICulture.DateTimeFormat.FirstDayOfWeek - (int)date.DayOfWeek);

while (date.Month < SelectedDate.Month || date.Year < SelectedDate.Year)
{
HtmlGenericControl day = new HtmlGenericControl("div");
day.Attributes.Add("class", "day");
days.Controls.Add(day);

date = date.AddDays(1);
}

/* Tilføj egentlige dage */
while (date.Month == SelectedDate.Month)
{
HtmlGenericControl day = new HtmlGenericControl("a");
day.Attributes.Add("href",
            Page.ClientScript.GetPostBackClientHyperlink(this, "select|" + date.Day));
if (date == SelectedDate)
day.Attributes.Add("class", "day day-selected");
else
day.Attributes.Add("class", "day");

day.InnerText = date.Day.ToString();
days.Controls.Add(day);

date = date.AddDays(1);
}

HtmlGenericControl clear = new HtmlGenericControl("div");
clear.Attributes.Add("class", "clear");
days.Controls.Add(clear);

Controls.Add(days);
}

Du downloader resten af koden samt de øvrige bidrag her.

Tags:

Mr. Frosts julekalender låge 15

by Administrator 15. December 2009 10:44

Husk at læse de praktiske småting.

Dette er en tilbagevende opgave som ingen tilsyneladende kan løse på 24 timer. Det nægter jeg simpelthen at tro på, så derfor forsøger jeg igen at gøre et nummer ud af den.

Du skal bygge en kalender i ASP.NET uden at bruge kalender kontrollen og uden at gøre brug af andre kontroller der kan det samme.

Med andre ord, byg en ASP.NET kalender fra bunden!

Præmien er en RFID læser samt tags:

touchatagstarterpackage

Tags:

Vinderen af låge nr. 13

by Administrator 15. December 2009 10:38

Niklas Christoffer Petersen har lavet det lille og fine compression modul i ASP.NET. Tillykke til dig Niklas.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO.Compression;
using System.IO;
using System.Text.RegularExpressions;

public class CompressionModule : IHttpModule
{
private IList<string> acceptedContentTypes;

public CompressionModule()
{
acceptedContentTypes = new List<string>
        { "text/html", "text/ccs", "text/javascript", "image/gif", "image/jpeg", "image/png" };
}

private void OnReleaseRequestState(object sender, EventArgs e)
{
HttpContext context = ((HttpApplication)sender).Context;
string acceptEncoding = context.Request.Headers["Accept-Encoding"];
string contentType = context.Response.ContentType.ToLower();

/* Skal denne Content Type komprimeres og accepterer klienten komprimering? */
if (acceptEncoding != null && acceptedContentTypes.Any
        (x => x.StartsWith(contentType, StringComparison.InvariantCultureIgnoreCase)))
{
acceptEncoding = acceptEncoding.ToLower();

if (acceptEncoding.Contains("deflate") || acceptEncoding.Equals("*"))
{
context.Response.AppendHeader("Content-Encoding", "deflate");
context.Response.Filter = new DeflateStream
                (context.Response.Filter, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("gzip"))
{
context.Response.AppendHeader("Content-Encoding", "gzip");
context.Response.Filter = new GZipStream
                (context.Response.Filter, CompressionMode.Compress);
}
}
}

public void Init(HttpApplication context)
{
context.ReleaseRequestState += new EventHandler(OnReleaseRequestState);
}

public void Dispose() { }
}

Der er et par kilo bolscher, en bog en pizza cutter på vej til dig.

Tags:

Vinderen af låge nr. 11

by Administrator 15. December 2009 10:32

Den eneste der er kommet med et foslag til låge 11 er – igen – Allan Hvam Petersen. Nu må i snart “pille” ham folkens :)

Her er Allans løsning.

clip_image002

clip_image002[5]

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MrFrost11.Default" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html401/strict.dtd">
<html>
<head>
<title>Mr. Frost </title>
<style type="text/css">
body { font-family: calibri; font-size: 10pt; }
h2 { font-size:11pt; }
.panel { height: 200px; width: 300px; }
div.panel a { color:#105CB6; text-decoration:none; }
div.panel a:hover, a:focus { color:#000033; }
.panel-footer { font-size: 10pt; text-align:right; font-weight:bold;}
div.panel ol { padding-left:20px; }
div.panel li { padding-bottom:5px;}
</style>
</head>
<body>
<div class="hslice" id="mrfrost" style="width: 320px">
<h2 class="entry-title">Mr. Frost - le Grand Bleu</h2>
<div class="entry-content">
<div class="panel">
<ol>
<%
   1:  foreach (var item in RssItems) { 
%>
<li><a href="<%= item.Url %>"><%
   1: = item.Title 
%></a></li>
<%
   1:   } 
%>
</ol>
<div class="panel-footer"><a href="http://danielfrost.dk/">&raquo; more</a></div>
</div>
</div>
</div>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.UI;
using System.Xml.Linq;

namespace MrFrost11
{
public class RssItem
{
public string Title { get; set; }
public string Url { get; set; }
}

public partial class Default : Page
{
public IEnumerable<RssItem> RssItems { get; private set; }

protected void Page_Load(object sender, EventArgs e)
{
var feed = XDocument.Load("http://danielfrost.dk/syndication.axd");

RssItems = (from item in feed.Descendants("item") select new RssItem
            { Title = item.Element("title").Value, Url = item.Element("link").Value }).Take(5);
}
}
}

Tags:

Vinderen af låge nr. 10

by Administrator 15. December 2009 10:18

Med dette F# forslag til en “generisk” regnemaskine, vinder Allan Hvam Petersen endnu en låge.

#light

open System
open Microsoft.FSharp.Text.Lexing
open MrFrost10

Console.Write "Input: "
let line = Console.ReadLine()

let lexbuf = Lexing.from_string line
let e = Parser.start Lexer.token lexbuf

let rec factorial = function
| 0 -> 1
| n -> n * factorial(n - 1)

let rec eval = function
Plus(e1, e2) -> eval e1 + eval e2
| Minus(e1, e2) -> eval e1 - eval e2
| Times(e1, e2) -> eval e1 * eval e2
| Divide(e1, e2) -> eval e1 / eval e2
| Modulo(e1, e2) -> eval e1 % eval e2
| Sin e -> Math.Sin (eval e)
| Cos e -> Math.Cos (eval e)
| Tan e -> Math.Tan (eval e)
| Sinh e -> Math.Sinh (eval e)
| Cosh e -> Math.Cosh (eval e)
| Tanh e -> Math.Tanh (eval e)
| Asin e -> Math.Asin (eval e)
| Acos e -> Math.Acos (eval e)
| Atan e -> Math.Atan (eval e)
| Atan2(e1, e2) -> Math.Atan2(eval e1, eval e2)
| Abs e -> Math.Abs (eval e)
| Ceiling e -> Math.Ceiling (eval e)
| Floor e -> Math.Floor (eval e)
| Exp e -> Math.Exp (eval e)
| Log e -> Math.Log (eval e)
| Log10 e -> Math.Log10 (eval e)
| Min(e1, e2) -> Math.Min(eval e1, eval e2)
| Max(e1, e2) -> Math.Max(eval e1, eval e2)
| Pow(e1, e2) -> Math.Pow(eval e1, eval e2)
| Sqrt e -> Math.Sqrt (eval e)
| Round e -> Math.Round (eval e)
| Sign e -> Float.of_int (Math.Sign (eval e))
| Truncate e -> Math.Truncate (eval e)
| Factorial e -> Float.of_int (factorial (Int32.of_float (eval e)))
| Float f -> f
| Pi -> Math.PI
| E -> Math.E

Console.WriteLine (eval e)

Tillykke med din nye bog!

I kan downloade resten af vinder løsningen her.

Tags:

Mr. Frosts julekalender – låge 14

by Administrator 14. December 2009 13:54

Thomas “Silverlight” Martinsen har lågen idag.

http://thomasmartinsen.wordpress.com/2009/12/14/lge-nr-14/

Tags:

Mr. Frosts julekalender låge 10, 11, 12 og 13.

by Administrator 13. December 2009 17:11

Husk at læse de praktiske småting.

Opgave 10

Byg en generisk regnemaskine i .NET, med så mange “regne funktioner” som muligt og med så lidt kode som muligt.

præmie (IL bog…neeerdy):

expert-net-il-assembler

Opgave 11

Byg en Internet Explorer 8 accellerator, webslice eller visual search add-on til en af de 20 websites du finder her.

præmie (programming kit):

cac6_xgs_microcontroller_programming_kit

Opgave 12:

Byg en kalender i ASP.NET uden at bruge en ASP.NET kontrol eller anden form for automatisk snask.

præmie (RFID reader samt tags):

touchatagstarterpackage

Opgave 13

Byg et HTTP module eller HTTP handler der kan komprimere så meget indhold som muligt (HTML, billeder, javascript, css, etc.) på dit website. Jo mere du kan komprimere jo bedre.

præmie (bolscer, iis bog, pizza cutter):

image iis_7 pizza-boss

Alle opgaver skal være løst senest d. 15 December

Tags:

Frosts Podcast Show #11 – Sitecore, SaaS, Research og Cloud Computing med Lars F. Nielsen

by Administrator 11. December 2009 18:08

I denne episode af Frosts Podcast Show snakker jeg med Lars F. Nielsen som er en VP i Sitecore Corporation. Lars og jeg snakker om hvordan Sitecore er blevet så populært, hvordan Sitecore, ligsom Microsoft, har en research afdeling til opfindelse eller genskabelse af nye idéer. Jeg er kort inde på Cloud computing ift. Sitecore i fremtiden også snakker vi også lidt om hvordan Sitecore bla. har baseret deres noget af deres forretning på SaaS.

Læs mere om Lars her.

Tags:

Vinderen af låge 9

by Administrator 10. December 2009 12:37

Der er kommet rigtig mange gode bud på hvor mange mennesker der arbejder i Microsoft “worldwide”.

Det vildeste bud var på over 1 million mennesker, så kom der et bud på 800.000 osv. Rigtig mange af jer var faktisk tæt på (give or take some), men det bedste bud kom nu alligevel fra Brian Holmgård Kristensen, som til dagligt arbejder i Vertica i København og er en af drivkrafterne bag ANUG. Tillykke til Brian der med sit svar på 175.700 kom rigtigt tæt på det virklige tal, 181.745. Jeg blev selv overrasket over at vi er så mange mennesker i virksomheden.

Tags:

Vinderen af låge 8

by Administrator 10. December 2009 09:46

Allan Hvam Petersen var den eneste der formåede at melde tilbage med en løsning på låge nr. 8.

Her er Allans bud på en løsning. Tillykke med sejren :)

using System;
using System.Linq;
using Microsoft.Scripting;
using Microsoft.Scripting.Hosting;
using IronPython.Hosting;
using System.Dynamic;

namespace MrFrost08
{
class PythonBuiltins : DynamicObject
{
private ScriptEngine Engine { get; set; }
private ScriptScope Scope { get; set; }

public PythonBuiltins()
{
Engine = Python.CreateEngine();

Scope = Engine.GetBuiltinModule();
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
return Scope.TryGetVariable(binder.Name, out result);
}
}

class Program
{
static void Main(string[] args)
{
dynamic pythonBuildins = new PythonBuiltins();

var pow = pythonBuildins.pow;
var result = pow(5, 5);
Console.WriteLine("5^5 = " + result);

var e = Enumerable.Range(0, 5);
var zip = pythonBuildins.zip;
var zipped = zip(e, e);
Console.WriteLine("Zipped:");
foreach (var item in zipped)
{
Console.WriteLine(item);
}
}
}
}


Tags:

Mr. Frosts julekalender låge 9

by Administrator 9. December 2009 12:30

Husk at læse de praktiske småting.

Vi har vidst lige brug et spørgsmål som ikke kræver alt for meget hjernegymnastik.

Du skal komme med et gæt på hvor mange mennesker der arbejder for Microsoft i hele verden. Jeg vil tilføje at i både skal tælle fuldtids ansatte samt de såkaldte “vendors” med.

Du vinder en RFID læser samt 10 RFID tags.

touchatagstarterpackage

Tags:

Slides og kode fra MVC code camp d. 30 November

by Administrator 9. December 2009 12:11

Copenhagen Software stod bag en MVC code camp her hos Microsoft i Hellerup. I den forbindelse blev der taget udgangspunkt i nogle slides samt noget kode.

Du finder begge dele lige her.

Husk også at lytte til min podcast med netop Copenhagen Software omkring der kerne forretningsområde SaaS.

Tags:

Vinderen af låge 7.

by Administrator 9. December 2009 11:29

Så fik jeg endelig noget VB kode ind i konkurrencen. Lækkert!

Lågens vinder har flottet sig og bygget et fedt library af extension methods til bla. generiske collections. Jeg synes der var andre der havde lavet noget næsten ligeså lækkert, men VB er efterhånden et sjældent syn og derfor synes jeg, jeg vil lade denne låge gå til Klaus Even Enevoldsen. TIllykke med dit nye Star Wars flagskib :)

Forøvrigt har Klaus en ganske fed blog på http://even.dk/

Module Module1
Sub Main()
' BigInteger sample
Dim A = New SortedSet(Of System.Numerics.BigInteger)()
A.Add(System.Numerics.BigInteger.One)
A.Add(System.Numerics.BigInteger.Zero)
A.Add(System.Numerics.BigInteger.MinusOne)
A.Add(CType(Int64.MaxValue, System.Numerics.BigInteger) + 1)
A.Add(CType(Int64.MinValue, System.Numerics.BigInteger) - 1)
Console.WriteLine(A.ToXmlString())

' Silly Parallel sample
Dim List = New List(Of System.Numerics.BigInteger)()
For i = 0 To 10
List.Add(i * 10)
Next

Console.WriteLine(List.AddOne().ToDelimitedString())

' My hopes
Console.WriteLine(String.Format("Will I Win The LEGO Clone Wars box? {0}", Boolean.TrueString.WillIWin()))

Console.ReadKey()
End Sub
End Module

Module ExtensionMethods
<System.Runtime.CompilerServices.Extension()>
Public Function ToXElement(Of T)(ByVal sortedSet As SortedSet(Of T)) As System.Xml.Linq.XElement
Dim Result = <SortedSet created=<%= Now().ToUniversalTime().ToString() %> datatype=<%= GetType(T).ToString() %>>
</SortedSet>

For Each Element In sortedSet
Result.Add(<Element><%= Element.ToString() %></Element>)
Next

Return Result
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function ToXmlString(Of T)(ByVal sortedSet As SortedSet(Of T)) As String
Return sortedSet.ToXElement().ToString()
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function WillIWin(Of T)(ByVal anything As T) As String
Return "Yes!"
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function AddOne(ByVal list As List(Of System.Numerics.BigInteger)) As List(Of System.Numerics.BigInteger)
Dim Result = New List(Of System.Numerics.BigInteger)()

For Each item In list.AsParallel()
Result.Add(item.AddOne())
Next

Return Result
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function AddOne(ByVal value As System.Numerics.BigInteger) As System.Numerics.BigInteger
Return value + 1
End Function

<System.Runtime.CompilerServices.Extension()>
Public Function ToDelimitedString(ByVal list As List(Of System.Numerics.BigInteger)) As String
Dim BobTheStringBuilder = New System.Text.StringBuilder()

For Each item In list
If BobTheStringBuilder.Length > 0 Then
BobTheStringBuilder.AppendFormat(", {0}", item.ToString())
Else
BobTheStringBuilder.Append(item.ToString())
End If
Next

Return BobTheStringBuilder.ToString()
End Function
End Module


Tags:

Vinderen af låge 6

by Administrator 8. December 2009 14:48

Puha, nu synes jeg alligevel det blev en smule svært at finde en vinder. Jeg har modtaget en del forslag til hvordan opgaven kan løses og størstedelen af dem er rimlig ens.

Mange af jer har brugt Queue typen i jeres egen type og det er sådan set cool nok, men se f.eks dette eksempel fra Rasmus Bjerner som 1. ikke bruger den 2. har rigtig lidt kode.

public class PriorityQueue<T>
{
private struct Data { public T t; public int priority; }
private readonly List<Data> list = new List<Data>();

public void InsertWithPriority(T element, int priority)
{
list.Insert(list.
Where(x => x.priority >= priority).Count(),
new Data { t = element, priority = priority });
}

public T GetNext()
{
if (list.Count > 0)
{
T t = list[0].t;
list.RemoveAt(0);
return t;
}
return default(T);
}

public T PeekAtNext()
{
return list.Count > 0 ? list[0].t : default(T);
}
}

Jeg synes ovenstående er elegant kode, let læseligt og overskueligt. Det eneste minus i denne kode er at priorteten skal være en integer.

En anden som har bidraget med noget næsten ligeså lækkert kode og lidt mere generisk er Allan Hvam Petersen. Se selv.

public class PriorityQueue<TItem, TPriority> : SortedList<TPriority, Queue<TItem>>
{
public TItem PeekAtNext()
{
return this.Last().Value.Peek();
}

public TItem GetNext()
{
var queue = this.Last().Value;
var item = queue.Dequeue();
if (queue.Count() == 0)
{
Remove(this.Last().Key);
}
return item;
}

public void InsertWithPriority(TItem item, TPriority priority)
{
if (ContainsKey(priority))
{
this[priority].Enqueue(item);
}
else
{
Add(priority, new Queue<TItem>(new[] { item }));
}
}
}

Jeg synes den her skal gå til Allan, selvom der var meget lækkert kode fra jer allesammen, synes jeg alligevel der var noget federe over Allans bud.

Der er et programmeringskit på vej til dig! Tillykke.

I kan finde koden fra lågen her.

Tags:

Powered by BlogEngine.NET 1.6.0.0
Theme by Mads Kristensen