2013-05-17 55 views
3

我有兩個集合配對類別沒有For循環

int[] numbers = {5, 2, 1, 5}; 
string[] words = {"flibble", "bobble", "double", "dumble"}; 

我想用使用第一第二收集LINQ表達式。使用循環我會做以下

List<string> results = new List<string>(); 
for(int i = 0; i<numbers.Count(), i++) 
{ 
    results.Add(words[i].SubString(numbers[i]); 
} 
return results; 

但是這涉及到沒有真正的理由創建一個列表...有沒有辦法在LINQ to做到這一點?

+1

_「但是這涉及到沒有真正的理由創建列表」 _但是你期望的結果是一個'名單',不是嗎? –

+0

請參閱http://blogs.msdn.com/b/ericlippert/archive/2009/05/07/zip-me-up.aspx,瞭解如何有效地編寫通用zip加入,如果您需要的話。 –

+0

@TimSchmelter我道歉它不是真的 - 這是我簡化的例子...我只想要一個IEnumerable,因此linq。 – Liath

回答

9

我猜你正在尋找Enumerable.Zip()

numbers.Zip(words, (n, w) => w.Substring(n)); 
+0

woah,從未見過Zip之前,很不錯 – Jason

1

你可以試試這個:

var res = words.Select((str, i) => str.Substring(numbers[i])) 
+0

如果你不在.NET 4.5上,這是一個很好的選擇! – Liath

+0

@Lath在4.5中發生了什麼? :) –

+1

@Liath:Enumerable.Zip在.NET 4.0中添加。 –

1

Zip另一種避免了缺陷(錯誤的長度或不同數量的項目收藏品)

IEnumerable<string> result = numbers 
.Select((len, i) => { 
    string word = words.ElementAtOrDefault(i); 
    if (word != null) 
    { 
     word = word.Length >= len ? word.Substring(0, len) : word; 
    } 
    return word; 
}); 

結果:flibb,bo,d,dumbl

Demo