I have the following code to duplicate the members of a list X
times.
Although it works it doesn\'t feel particularly clean.
Live code example:
Perhaps something along the lines of:
var serviceEndPoints = splitEndPoints.SelectMany(t =>
Enumerable.Repeat(t, instances)).ToList();
That will give you "A,A,A,B,B,B,C,C,C". If you want "A,B,C,A,B,C,A,B,C":
var serviceEndPoints = Enumerable.Repeat(
splitEndPoints, instances).SelectMany(t => t).ToList();
Splitting the two components...
var parts = source.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
var serviceEndPoints = (from i in Enumerable.Range(0, instances * parts.Length)
let j = i / instances
let part = parts[j]
select new ServiceEndPoint { Index = j, Uri = part }).ToList();
or...
var parts = source.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
var serviceEndPoints2 = (from i in Enumerable.Range(0, parts.Length)
let part = parts[i]
from j in Enumerable.Range(0, instances)
select new ServiceEndPoint { Index = i, Uri = part }).ToList();
It's very similar to two for
one inside the other :-)
You can do this with a little Linq:
int instances = 3;
var serviceEndPoints =
(from e in Enumerable.Range(0, instances)
from x in serviceEndPoints
select x)
.ToList();
Or if you prefer fluent syntax:
var serviceEndPoints = Enumerable
.Range(0, instances)
.SelectMany(e => serviceEndPoints)
.ToList();
Note that given a list like { A, B, C }
will produce a list like { A, B, C, A, B, C, A, B, C }
. If you want to produce a list like { A, A, A, B, B, B, C, C, C }
, you can simply reverse the order of the collections:
var serviceEndPoints =
(from x in serviceEndPoints
from e in Enumerable.Range(0, instances)
select x)
.ToList();
Or in fluent syntax:
var serviceEndPoints = serviceEndPoints
.SelectMany(x => Enumerable.Range(0, instances), (x, e) => x)
.ToList();