13,054,779 members (70,313 online)
Technical Blog
alternative version

#### Stats

12K views
7 bookmarked
Posted 8 Jul 2014

# Finding First Unique Number

, 24 Jul 2014
 Rate this:
Looking at ways to get the first unique number in a sequence

## 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:

1. Change from `y.Count` to` y.Any`
2. `numberArray.GroupBy(g => g).Where(w => w.Count() == 1).Select(s => s.Key).FirstOrDefault();`
3. `numberArray.ToLookup(x => x).First(x => x.Count() == 1).Key;`
4. `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.

## Share

 Software Developer (Senior) United Kingdom
No Biography provided

## You may also be interested in...

 Pro

 First Prev Next
 Jitter time? Matt T Heffron28-Jul-14 12:48 Matt T Heffron 28-Jul-14 12:48
 Re: Jitter time? Bruce Bennett28-Jul-14 23:09 Bruce Bennett 28-Jul-14 23:09
 Traditional? irneb10-Jul-14 5:42 irneb 10-Jul-14 5:42
 Re: Traditional? Bruce Bennett10-Jul-14 6:22 Bruce Bennett 10-Jul-14 6:22
 Re: Traditional? irneb10-Jul-14 18:00 irneb 10-Jul-14 18:00
 My vote of 4 CatchExAs9-Jul-14 3:51 CatchExAs 9-Jul-14 3:51
 Last Visit: 31-Dec-99 18:00     Last Update: 27-Jul-17 19:26 Refresh 1

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

Web02 | 2.8.170713.1 | Last Updated 24 Jul 2014
Article Copyright 2014 by Bruce Bennett