2012-11-15 72 views
0

是否存在與以下代碼等效的LINQ表達式?替換爲LINQ的循環

int noOfColumns = 10; 
for (int i = 2; i <= noOfColumns+1; i++) 
{      
    sql.AppendFormat(" [{0}{1}] [varchar]({2}),", "commodity", columnLength); 
} 
+1

Flippant回答:這段代碼不能編譯。更認真的答案?可能不是性能高的一個。 – Rawling

+0

我只是想生成動態sql來創建一個代碼後面的表。列數將在運行時更改(可能會有1000次)。作爲LINQ的新手,我認爲它可能會增加價值。謝謝你的所有時間 –

+0

@Kiran:你對當前的代碼有任何問題嗎?爲什麼你想在'linq'中做到這一點? –

回答

3
Enumerable.Range(2, noOfColumns+1) 
    .ToList() 
    .ForEach(i => 
    sql.AppendFormat(" [{0}{1}] [varchar]({2}),", "commodity" columnLength)); 

但我不認爲它看起來更好:-)。

+0

我已經刪除了我的'-1',因爲我_pretty_確定你在開玩笑:) – Rawling

+0

這只是一個問題的答案:-)我希望它能告訴作者無需在任何地方使用LINQ – Nagg

+1

@ Nagg:我不確定這部分沒有出現任何錯誤''商品'columnLength' –

0

試試這個,

Enumerable.Range(2, noOfColumns).ToList().ForEach(r => { sql.AppendFormat(" [{0}{1}] [varchar]({2}),", "commodity" columnLength); }); 
+0

你是對的,拿掉'+ 1'修復了一個範圍錯誤,不是嗎?請接受我的道歉。我的downvote被鎖定了,但是如果你編輯了你的答案(你可以把一些linebreaks放進去!),那麼我可以刪除它。 – Rawling

+0

@Swani:似乎這不會編譯! –

+1

@huMptyduMpty,如果您忽略該部分,則問題本身不編譯('[{0} {1}] [varchar]({2}),「,」commodity「columnLength);')。 :) –

1

對於它的價值,在(編譯)LINQ的替代將是:

IEnumerable<string> cols = Enumerable.Range(2, noOfColumns +1) 
    .Select(i => string.Format(" [{0}] [varchar]({1})", "commodity", columnLength)); 
string sql = string.Join(",", cols); 

但我必須承認,我不知道你在做什麼。

+1

TIL:'String.Join'在幕後使用了一個'StringBuilder'。 – Rawling

+0

@Rawling:是的,你是對的。刪除了「沒有'StringBuilder'」。 –

+0

這不是一種批評,我只是從來沒有想過它,並認爲'Join'(至少是數組版本)將爲整個事物分配空間,然後填充它。 – Rawling

1

Enumerable.Range的參數是startcount。這意味着它不會直接替換循環。

for(var i = 5; i < 8; ++i)會產生從5號〜7

Enumerable.Range(5, 8)將產生的數字爲5〜12(5 + 8-1)。

爲了達到預期效果,需要使用Enumerable.Range(start, end - start)