12,300,841 members (63,336 online)
Technical Blog
alternative version

11K views
7 bookmarked
Posted

# Finding first unique number.

, 24 Jul 2014 CPOL
 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 want to see how other devs approached the solution and the following are alternatives 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

Switching to use `.Any() `was surprising how big a difference it made. The other surprise was the difference between `.GroupBy()` and `.ToLookup()`

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

All solutions where 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     Traditonal 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...

 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: 29-May-16 19:57 Refresh 1