Introduction
Like I said in a [previous post of mine][1].
From time to time I answer a few questions on Stackoverflow, mostly because you can learn a lot from someone else’s problems and it makes you think.
[
][2]
Thinking is something you need to practice every day.
This time the problem was simple and it seems like most people revert to a for loop loop to solve it. While using linq is so much shorter easier to read.
The question
The question was how to “[Find the first non-repeating character in a string in VB.NET][3]”
First of all we need some more test data.
Imports System.Linq
Module Module1
Sub Main()
Console.WriteLine(FirstCharacterToNotRepeat(Nothing))
Console.WriteLine(FirstCharacterToNotRepeat(""))
Console.WriteLine(FirstCharacterToNotRepeat("BBEEXEE"))
Console.WriteLine(FirstCharacterToNotRepeat("BBEEEE"))
Console.WriteLine(FirstCharacterToNotRepeat("XBBEEEE"))
Console.WriteLine(FirstCharacterToNotRepeat("BBEEEEX"))
Console.WriteLine(FirstCharacterToNotRepeat("BBEEXEEACEED"))
Console.ReadLine()
End Sub
Private Function FirstCharacterToNotRepeat(ByVal input As String) As String
return String.Empty
End Function
End Module
And now we need some answers.
The for loop
Here is my solution using a for loop.
Private Function FirstCharacterToNotRepeat(ByVal input As String) As String
If String.IsNullOrEmpty(input) Then Return String.Empty
Dim charlist As New Dictionary(Of Char, Int32)
For Each c In input
If charlist.Keys.Contains(c) Then
charlist(c) = charlist(c) + 1
Else
charlist.Add(c, 1)
End If
Next
For Each c In charlist
If c.Value = 1 Then Return c.Key
Next
Return String.Empty
End Function```
There are actually 2 for loops in there, one to put every character in the dictionary and count the occurrences and one to get out the first element that has only 1 occurrence.
## The linq solution
And here is my linq solution.
```vbnet
Private Function FirstCharacterToNotRepeat(ByVal input As String) As String
If String.IsNullOrEmpty(input) Then Return String.Empty
Return (input.GroupBy(Function(x) x).Where(Function(x) x.Count = 1).Select(Function(x) x.First))(0)
End Function```
First I do a group by on all characters. Then I do a where on the count of the result of the group by, where I only want the occurrences with a count of 1. And then I just select the first occurrence with a count of 1.
Simple.
## Conclusion
Knowing and using linq can make your code so much shorter and easier for you to write and read.
[1]: /index.php/DesktopDev/MSTech/join-and-skipwhile
[2]: http://stackoverflow.com/users/2936/chrissie1
[3]: http://stackoverflow.com/questions/8108714/find-the-first-non-repeating-character-in-a-string-in-vb-net