using System.Collections.Generic;
using System.Linq;
public static class RnaTranscription
{
public static string ToRna(string dna) =>
new(dna.Select(nucleotide => Complements[nucleotide]).ToArray());
private static readonly Dictionary<char, char> Complements =
new() { ['G'] = 'C', ['C'] = 'G', ['T'] = 'A', ['A'] = 'U' };
}
The first step is to decide how we want to iterate over and transform the nucleotides.
As the string
class implements the IEnumerable<char>
interface, this allows us to call
LINQ's Select()
method on it, which can do both the iteration and the transformation in one go!
dna.Select(nucleotide => TODO)
Within the Select()
method's lambda argument, we'll need to translate the nucleotide to its complement.
We can do that by creating a dictionary with the key being the nucleotide and the value its complement:
private static readonly Dictionary<char, char> Complements = new Dictionary<char, char>
{
['G'] = 'C',
['C'] = 'G',
['T'] = 'A',
['A'] = 'U'
};
Using a target-typed new expression, we can omit the second Dictionary<char, char>
type:
private static readonly Dictionary<char, char> Complements = new()
{
['G'] = 'C',
['C'] = 'G',
['T'] = 'A',
['A'] = 'U'
};
We can then use this dictionary in our lambda to get the nucleotide's complement:
dna.Select(nucleotide => Complements[nucleotide])
This will return a new IEnumerable<char>
, which we can convert back to a string
by first converting it to a char[]
and then passing that to a string constructor:
public static string ToRna(string dna)
{
return new string(dna.Select(nucleotide => Complements[nucleotide]).ToArray());
}
As this has just a single return
statement, we can convert it to an [expression-bodied method][expression-bodied-method]:
public static string ToRna(string dna) =>
new string(dna.Select(nucleotide => Complements[nucleotide]).ToArray());
Finally, we can once again use a target-typed new expression to replace new string
with just new
:
public static string ToRna(string dna) =>
new(dna.Select(nucleotide => Complements[nucleotide]).ToArray());
And with that we have a concise, working implementation!
Alternative: using a foreach
loop
You could also use a regular foreach
loop instead of LINQ:
public static string ToRna(string dna)
{
var rna = "";
foreach (var nucleotide in dna)
rna += Complements[nucleotide];
return rna;
}