在列表中创建重复项

Pad*_*ddy 5 c# linq

我有以下代码来复制列表X时间的成员.

虽然它有效,但感觉不是特别干净.

实时代码示例:http://rextester.com/UIVZVX7918

public static List<ServiceEndPoint> GetServiceEndPoints()
{
    const string source = "http://webSiteA.asmx,http://webSiteB.asmx";
    const int instances = 3;

    var splitEndPoints =  source.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                                    .Select((s, i) => new ServiceEndPoint
                                                                {
                                                                    Index = i,
                                                                    Uri = s
                                                                })
                                                                .ToList();

    // Duplicate the contents of splitEndPoints "instances" number of times
    var serviceEndPoints = new List<ServiceEndPoint>();
    foreach (var point in splitEndPoints)
    {
        for (var i = 0; i < instances; i++)
        {
            serviceEndPoints.Add(point);
        }
    }

    return serviceEndPoints;
}

public class ServiceEndPoint
{
    public int Index { get; set; }
    public string Uri { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

Jim*_*hel 15

也许是这样的:

var serviceEndPoints = splitEndPoints.SelectMany(t =>
    Enumerable.Repeat(t, instances)).ToList();
Run Code Online (Sandbox Code Playgroud)

那会给你"A,A,A,B,B,B,C,C,C".如果你想要"A,B,C,A,B,C,A,B,C":

var serviceEndPoints = Enumerable.Repeat(
    splitEndPoints, instances).SelectMany(t => t).ToList();
Run Code Online (Sandbox Code Playgroud)


p.s*_*w.g 8

你可以用一点Linq做到这一点:

int instances = 3;
var serviceEndPoints = 
    (from e in Enumerable.Range(0, instances)
     from x in serviceEndPoints
     select x)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

或者如果您更喜欢流利的语法:

var serviceEndPoints = Enumerable
    .Range(0, instances)
    .SelectMany(e => serviceEndPoints)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,给定一个列表{ A, B, C }就会生成一个列表{ A, B, C, A, B, C, A, B, C }.如果要生成类似的列表{ A, A, A, B, B, B, C, C, C },则可以简单地反转集合的顺序:

var serviceEndPoints = 
    (from x in serviceEndPoints
     from e in Enumerable.Range(0, instances)
     select x)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

或者用流利的语法:

var serviceEndPoints = serviceEndPoints
    .SelectMany(x => Enumerable.Range(0, instances), (x, e) => x)
    .ToList();
Run Code Online (Sandbox Code Playgroud)