Create duplicate items in a list

后端 未结 3 1701
再見小時候
再見小時候 2021-01-05 16:08

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:

相关标签:
3条回答
  • 2021-01-05 16:36

    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();
    
    0 讨论(0)
  • 2021-01-05 16:40

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

    0 讨论(0)
  • 2021-01-05 16:44

    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();
    
    0 讨论(0)
提交回复
热议问题