Thursday, January 12, 2023

The Fastest Way To Loop In C#

These are different ways to loop over a collection:

  • do()
  • do/while()
  • for()
  • foreach()
  • ForEach()
  • For()
  • For(MaxDegreeOfParallelism)
  • ForEach()
  • ForEach(MaxDegreeOfParallelism)
  • ForEachAsync()
  • ForEachAsync(MaxDegreeOfParallelism)

Which one of these ways to loop over a collection do you think is the fastest? First, let’s look at a few of these ways to loop over an array. This is an example of using Parallel.For() with MaxDegreeOfParallelism:

var collection = personArray;
ParallelOptions options = new() {
    MaxDegreeOfParallelism = 6
};
_ = Parallel.For(fromInclusive: 0, toExclusive: collection.Length, parallelOptions: options, body: (index) => {
    base.Update(collection[index]);
});
C#

Benchmark Results

Here are the benchmark results that shows using Parallel.For() for a reference, value and record type.



Here is an example of using Parallel.ForEachAsync().

var collection = _personRecordArray;
await Parallel.ForEachAsync(collection, (person, token) => {
    base.Update(person);
    return new ValueTask();
});
C#

Benchmark Results

Here are the benchmark results that shows using Parallel.ForEachAsync() for a reference, value and record type.



As you can see from these benchmarks, using Parallel.ForEachAsync() is a lot slower than using Parallel.For() (around 6.86 times slower).

So, what is the fastest way to loop over an array? Well, according to my benchmark tests, it can actually vary depending on the type used in the array. If the array contains a reference or value type, then using for() is the clear winner! If the array contains the record type, then using Parallel.For() is the fastest (around 1.13 times faster) Here is an example:

var collection = personRecordArray;
_ = Parallel.For(0, collection.Length, (index) => {
    base.Update(collection[index]);
});
C#

In all of my benchmark tests, value types (structures) loops the slowest when compared to the reference and record type. I recommend to not use them in collections.

Using Spargine to Speed Up Arrays

I am currently making changes to my OSS project Spargine based on the findings in the latest edition of my code performance book. To make processing collections as fast as possible easy, I’m adding extension methods called PerformAction(). Here is how I unit test this method:

var words = RandomData.GenerateWords(count: 10, minLength: 10, maxLength: 100).ToArray();
var sb = new StringBuilder();
words.PerformAction((word) => {
    sb.Append(word);
});
var result = sb.ToString();
C#

This method also verifies there are items in the array to prevent exceptions. I will be using this method from now on when processing arrays because if the .NET team comes out with an even faster way to loop over an array, I can just change the code in PerformAction() and instantly all projects that use it get the performance boost! Code reuse is a good thing! I will revisit these methods whenever I do a major run of my benchmark tests so make sure to keep the Spargine NuGet packages up to date. You can add Spargine to your projects by going here: http://bit.ly/dotNetDaveNuGet.

Tuesday, January 3, 2023

SingleOrDefault vs FirstOrDefault

 SingleOrDefault returns a SINGLE element or null if no element is found. If 2 elements are found in your Enumerable then it throws the exception you are seeing. Just like Highlander... with Single - there can be only one.

FirstOrDefault returns the FIRST element it finds or null if no element is found. so if there are 2 elements that match your predicate the second one is ignored.

deliveryGroup.DeliveryMethods.SingleOrDefault(x => x.Id == methodId)

deliveryGroup rd = this.db.Details .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);


its use very careful because when found any duplicate SingleOrDefault it will throw error.

Convert json date in jQuery

 The date format js is give in the below section, please go below and see the date.format.js and copy and use it.

Table of content for JSON date format

  1. JSON date
  2. Parse JSON date to date
  3. Date format types
  4. Demo link for live output
  5. JavaScript code for date format
  6. Full example code for multiple date format

 The JSON date is
        /Date(1297246301973)/

The JQuery Code is
        var jsonDate = "\/Date(1297246301973)\/";
        var date = new Date(parseInt(jsonDate.substr(6)));

Opps Part 1 : Abstraction

  Abstraction in C# is a fundamental concept of object-oriented programming (OOP) that allows developers t...