2013-08-06 72 views
3

我有以下代碼來複制列表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; } 
} 

是否有這樣做的更好的辦法?如果你喜歡通順語法

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

或者:

var serviceEndPoints = Enumerable 
    .Range(0, instances) 
    .SelectMany(e => serviceEndPoints) 
    .ToList(); 

注意,給予相同的{ A, B, C }列表會產生像{ A, B, C, A, B, C, A, B, C }列表

+1

你需要他們的順序重複內,或將X,Y,Z,X,Y,Z,X,Y, Z爲你工作呢? –

+0

@JonSkeet順序並不重要,有些人可能會認爲不合順序會更好 – Paddy

回答

11

也許沿着線的東西:

var serviceEndPoints = splitEndPoints.SelectMany(t => 
    Enumerable.Repeat(t, instances)).ToList(); 

這會給你「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(); 
+1

+1,我更喜歡'Repeat'到'Range'。 – Rawling

+1

在第二種解決方案中,您不需要'.Select(t => t)'。 –

+0

@ p.s.w.g:謝謝。糾正。 –

8

您可以用少許的Linq做到這一點。如果要產生像{ 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(); 

或者用流利的語法:

var serviceEndPoints = serviceEndPoints 
    .SelectMany(x => Enumerable.Range(0, instances), (x, e) => x) 
    .ToList(); 
1

分割的兩個組件...

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(); 

或...

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(); 

這是非常相似的兩個for一個其他:-)