## Introduction

Recently, I took a test to find the first unique number in an array. I did manage to produce the right answer, but it was computationally too expensive. This post is the result of looking into alternatives.

## Original Solution

var y = numberArray.GroupBy(z => z).Where(z => z.Count() == 1)
.Select(z => z.Key).ToList();
if (y.Count > 0) actual = y[0];

## Alternatives

I asked for help on Stack Overflow as I wanted to see how other devs approached the solution and following are alternatives that where suggested:

- Change from
`y.Count`

to` y.Any`

`numberArray.GroupBy(g => g).Where(w => w.Count() == 1).Select(s => s.Key).FirstOrDefault();`

`numberArray.ToLookup(x => x).First(x => x.Count() == 1).Key;`

`numberArray.GroupBy(x => x).First(x => x.Count() == 1).Key;`

In order to make head or tail of the speed difference, I decided to run some tests, the template for each test is.

var sw = new System.Diagnostics.StopWatch2() { ShowStatsForEachLoop = false };
int actual = 0;
sw.Restart();
sw.Start();
for (int i = 0; i < Iterations; i++)
{
Find comparison here
sw.RestartAndLog();
}
sw.Stop();

## Test Results

It was surprising how big a difference switching to use `.Any() `

made. The other surprise was the difference between `.GroupBy()`

and `.ToLookup()`

If you want speed, then you should look at using traditional loops instead of LINQ.

All solutions were run 50 times with an array of 9 numbers, the last number being the unique number. The results below record the average number of CPU ticks for each test.

**Ticks**
Min Max Avg Result
2 14502 584 -3 Original
2 919 40 -3 if (y.Any()) actual = y[0];
2 1423 60 -3 a.GroupBy(g => g).Where(w => w.Count() == 1)
.Select(s => s.Key)
.FirstOrDefault();
2 1553 65 -3 a.ToLookup(i => i).First(i => i.Count() == 1).Key;
2 317 15 -3 a.GroupBy(i => i).First(i => i.Count() == 1).Key;
1 4 2 -4 Traditional loops

## Source Code

The source code can be found on gitHub @ https://github.com/hungrydev/FirstUniqueNumberExporation.