Click here to Skip to main content
14,330,237 members

Dominic Burford - Professional Profile


Follow on Twitter LinkedIn      Blog RSS
I am a professional software engineer and architect with over eighteen years commercial development experience with a strong focus on the design and development of web and mobile applications.

I have experience of architecting scalable, distributed, high volume web applications that are accessible from multiple devices due to their responsive web design, including architecting enterprise service-oriented solutions. I have also developed enterprise mobile applications using Xamarin and Telerik Platform.

I have extensive experience using .NET, ASP.NET, Windows and Web Services, WCF, SQL Server, LINQ and other Microsoft technologies. I am also familiar with HTML, Bootstrap, Javascript (inc. JQuery and Node.js), CSS, XML, JSON, Apache Cordova, KendoUI and many other web and mobile related technologies.

I am enthusiastic about Continuous Integration, Continuous Delivery and Application Life-cycle Management having configured such environments using CruiseControl.NET, TeamCity and Team Foundation Services. I enjoy working in Agile and Test Driven Development (TDD) environments.

Outside of work I have two beautiful daughters. I am also an avid cyclist who enjoys reading, listening to music and travelling.



For more information on Reputation please see the FAQ.


Members need to achieve at least one of the given member levels in the given reputation categories in order to perform a given action. For example, to store personal files in your account area you will need to achieve Platinum level in either the Author or Authority category. The "If Owner" column means that owners of an item automatically have the privilege. The member types column lists member types who gain the privilege regardless of their reputation level.

ActionAuthorAuthorityDebatorEditorEnquirerOrganiserParticipantIf OwnerMember Types
Have no restrictions on voting frequencysilversilversilversilverAdmin
Bypass spam checks when posting contentsilversilversilversilversilversilvergoldSitebuilder, Subeditor, Mentor, Protector, Editor, Staff, Admin
Store personal files in your account areaplatinumplatinumSitebuilder, Subeditor, Supporter, Editor, Staff
Have live hyperlinks in your profilebronzebronzebronzebronzebronzebronzesilverSubeditor, Protector, Editor, Staff, Admin
Have the ability to include a biography in your profilebronzebronzebronzebronzebronzebronzesilverSubeditor, Protector, Editor, Staff, Admin
Edit a Question in Q&AsilversilversilversilverYesSubeditor, Protector, Editor, Admin
Edit an Answer in Q&AsilversilversilversilverYesSubeditor, Protector, Editor, Admin
Delete a Question in Q&AYesSubeditor, Protector, Editor, Admin
Delete an Answer in Q&AYesSubeditor, Protector, Editor, Admin
Report an ArticlesilversilversilversilverSubeditor, Mentor, Protector, Editor, Staff, Admin
Approve/Disapprove a pending ArticlegoldgoldgoldgoldSubeditor, Mentor, Protector, Editor, Staff, Admin
Edit other members' articlesSubeditor, Protector, Editor, Admin
Create an article without requiring moderationplatinumSubeditor, Mentor, Protector, Editor, Staff, Admin
Approve/Disapprove a pending QuestionProtector, Admin
Approve/Disapprove a pending AnswerProtector, Admin
Report a forum messagesilversilverbronzeProtector, Editor, Admin
Approve/Disapprove a pending Forum MessageProtector, Admin
Create a new tagsilversilversilversilverAdmin
Modify a tagsilversilversilversilverAdmin

Actions with a green tick can be performed by this member.

GeneralChunking your lists into multiple smaller lists Pin
Dominic Burford11-Sep-19 3:40
professionalDominic Burford11-Sep-19 3:40 
As part of the development of our new app feature, we are adding the ability to allow users to track their journeys. They can Start / Stop the journey tracking and allow the app to record their distance, time taken etc. This is primarily to be used to allow users to support mileage claims.

A journey takes the form of a Model containing properties for storing the user, start date, end date, mileage etc. The journey also contains a list of waypoints. These are the longitude / latitude points that are generated by the user's position. A waypoint is taken every 5 seconds and added to the list of waypoints for the journey. From these waypoints we can then generate a map of their journey and display this to them.

During initial testing everything was fine as we tested the feature on smaller journeys containing a few hundred waypoints. As we began stress testing the feature, we noticed we were getting timouts as we started to exceed 800 or so waypoints. By 1000 waypoints were getting regular timeouts. We discovered the reason was due to the volume of waypoints we were posting back to our service. As the number of waypoints grew, the time taken to POST the data over our RESTful service grew too. And this was causing our timeout problem.

I investigated several options, but the cleanest and most simple was to chunk the waypoints into smaller discrete lists which we would POST. So instead of POSTing all of the waypoints in one large payload, we would instead send multiple smaller payloads.

So how do you chunk your list into a list of smaller lists? There are many ways of achieving this, and I'm sure those of you reading this article will be able to suggest your own versions of the algorithm I have used here. Firstly, instead of using a hard-coded version that only works with journey waypoint lists, I have implemented an extension method that can work with any type of list. This allows me to chunk any type of list data going forwards (I have already got a few ideas in mind of how I will reuse this extension method).
public static IEnumerable<IEnumerable<T>> GetChunk<T>(this IEnumerable<T> source, int chunksize)
    if (chunksize <= 0 || source == null) yield return null;
    var pos = 0;
    while (source.Skip(pos).Any())
        yield return source.Skip(pos).Take(chunksize);
        pos += chunksize;
So we can see that what is returned is a list of lists of type T. The extension method is applied to the source list (which is to be chunked into smaller lists). The parameter to the extension method is the number of items to appear in each chunked list. The implementation uses the LINQ methods of Skip() and Take() to iterate over the list. The Skip() method will ignore the first n items in the list. The Take() method will then take the next n elements from the list. These methods therefore when used in conjunction easily iterate over our list. The use of yield return helps to iterate over the list in an efficient manner by processing the next item without having to process the entire list (lazy evaluation).

In our specific case for chunking our journey waypoints, we have set the chunking value to 500. Although the problem didn't appear until at least 800 items, I wanted to keep the value to a safe, low limit just to err on the side of caution.

Here is the code from one of the unit tests I've written that exercises the chunking extension method.
public void GetChunk1000Tests()
    const int waypointcount = 1000;

    //Arrange - fetch dummy data for the test
    var journey = ListExtensionsTests.GetTaskTrackedJourneyForUnitTest(waypointcount);


    Console.WriteLine($"ChunkCount: {ListExtensionsTests.ChunkCount}");
    Console.WriteLine($"Number of waypoints: {journey.Waypoints.Waypoints.Count}");

    Assert.IsTrue(journey.Waypoints.Waypoints.Count == waypointcount);
    //Act - chunk the list of waypoints        
    var result = journey.Waypoints.Waypoints.GetChunk(500);


    var enumerable = result.ToList();
    Console.WriteLine($"Number of chunks: {enumerable.Count()}");

    int incrementalwaypointcount = 0;

    //we can now iterate through the chunked list 
    foreach (var item in enumerable)
        Console.WriteLine($"Number of chunks in list {item.Count()}");
        incrementalwaypointcount += item.Count();

    Assert.AreEqual(waypointcount, incrementalwaypointcount);
So in summary, if you are dealing with large lists of items and need to break them down in smaller, more manageable lists, then chunking them is a simple and very effective solution. This works great in our mobile app where we are sending large lists of data to a backend service using the resource hungry environment of the smart phone where memory and processing power are in short supply. Processing numerous smaller lists is more efficient (and less error prone) than trying to process one large list. It also uses less resources (memory, CPU) to do so.
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult." - C.A.R. Hoare

Home | LinkedIn | Google+ | Twitter

GeneralWriting flexible filters for your data using Predicates Pin
Dominic Burford16-Jul-19 6:11
professionalDominic Burford16-Jul-19 6:11 
GeneralRe: Writing flexible filters for your data using Predicates Pin
Slacker00716-Jul-19 22:09
professionalSlacker00716-Jul-19 22:09 
GeneralRe: Writing flexible filters for your data using Predicates Pin
Dominic Burford17-Jul-19 1:17
professionalDominic Burford17-Jul-19 1:17 
GeneralBlocking Asynchronous Code Pin
Dominic Burford4-Jul-19 22:11
professionalDominic Burford4-Jul-19 22:11 
GeneralDesigning and implementing flexible RESTful services Pin
Dominic Burford14-Jun-19 0:50
professionalDominic Burford14-Jun-19 0:50 
GeneralWriting asynchronous code with .NET Pin
Dominic Burford10-Jun-19 3:34
professionalDominic Burford10-Jun-19 3:34 
GeneralWeird Minification Behaviour in ASP.NET Core Pin
Dominic Burford28-May-19 3:54
professionalDominic Burford28-May-19 3:54 
GeneralThe Importance of Structure and Dilligence Pin
Dominic Burford24-May-19 6:14
professionalDominic Burford24-May-19 6:14 
GeneralWhen should you rewrite that legacy application? Pin
Dominic Burford22-May-19 0:03
professionalDominic Burford22-May-19 0:03 
GeneralImproving Your SQL Stored Procedures Pin
Dominic Burford2-May-19 5:47
professionalDominic Burford2-May-19 5:47 
GeneralPassing a list of items to a SQL stored procedure Pin
Dominic Burford27-Mar-19 0:55
professionalDominic Burford27-Mar-19 0:55 
GeneralSoftware development is like plumbing Pin
Dominic Burford8-Mar-19 5:12
professionalDominic Burford8-Mar-19 5:12 
GeneralVersioning a .NET Core 2.2 application Pin
Dominic Burford7-Mar-19 5:04
professionalDominic Burford7-Mar-19 5:04 
GeneralUsing tags with push notifications from Azure Notification Hub Pin
Dominic Burford17-Feb-19 23:21
professionalDominic Burford17-Feb-19 23:21 
GeneralSending Push Notifications with Azure Notification Hub Pin
Dominic Burford25-Jan-19 4:34
professionalDominic Burford25-Jan-19 4:34 
GeneralUnit testing a Xamarin Forms mobile app Pin
Dominic Burford13-Jan-19 21:59
professionalDominic Burford13-Jan-19 21:59 
GeneralApple development sucks Pin
Dominic Burford8-Jan-19 1:09
professionalDominic Burford8-Jan-19 1:09 
GeneralBut the tech giants are private companies Pin
Dominic Burford19-Dec-18 5:31
professionalDominic Burford19-Dec-18 5:31 
GeneralThe latest version of our app nears completion Pin
Dominic Burford7-Dec-18 2:21
professionalDominic Burford7-Dec-18 2:21 
GeneralIs Silicon Valley a force for good? Pin
Dominic Burford27-Nov-18 21:57
professionalDominic Burford27-Nov-18 21:57 
GeneralUsing Javascript to retrieve values from a Xamarin Forms WebView Pin
Dominic Burford27-Nov-18 5:01
professionalDominic Burford27-Nov-18 5:01 
GeneralUsing the MVVM pattern with a Xamarin Forms mobile app Pin
Dominic Burford21-Nov-18 1:13
professionalDominic Burford21-Nov-18 1:13 
GeneralConsuming a private nuget feed in an Azure DevOps build pipeline Pin
Dominic Burford2-Nov-18 6:55
professionalDominic Burford2-Nov-18 6:55 
GeneralBuild a Xamarin.Forms iOS mobile app using Azure DevOps Pin
Dominic Burford8-Oct-18 23:38
professionalDominic Burford8-Oct-18 23:38 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.