我有以下代码来复制列表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)
你可以用一点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)
| 归档时间: |
|
| 查看次数: |
5615 次 |
| 最近记录: |