2013-03-11 21 views
-1

嗨我有一些麻煩我有一個非常簡單的腳本任務在SSIS中。這是第一次用LINQ困惑爲什麼IEnumerable工作無效參數

string iFileName = (string)(Dts.Variables["iFileName"].Value); 
string oFileName = (string)(Dts.Variables["oFileName"].Value); 

try 
{ 
    // string[] lines = File.ReadAllLines(@"\\Fcwdsqlanl01\e$\SQL_OLAP\Log\Billing_2.log"); 

    IEnumerable<string> stringsOut = File.ReadAllLines(iFileName) 
      .Where(line => (char.IsDigit(line, 0)) && line.Contains(",")) 
      .Select(line => line); 

    File.WriteAllLines(oFileName, stringsOut); 
} 
catch (Exception e) 
{ 
    MessageBox.Show(e.Message); 
} 

這是我得到

最好重載匹配的錯誤「System.IO.File.WriteAllLines(字符串,字符串 [])」有很多無效的論點。

我不明白爲什麼它有一個參數問題,因爲我用它與ReadAllLines相同的方式。我已經檢查並且stringsOut變量保存着我想要的字符串數組。我意識到有這樣做的方法不使用WriteAllLines,但我想這樣做,假設我缺少一些簡單的東西。

+1

您可能需要使用,需要一個'字符串[]'(只是調用'ToArray的過載()'在端)因爲['IEnumerable '重載](http://msdn.microsoft.com/zh-cn/library/dd383693.aspx)是.NET 4中的新增功能。您使用的是什麼框架版本? – 2013-03-11 16:07:36

+0

我永遠不會理解爲什麼人們使用SSIS並在腳本任務中完成所有工作 – msmucker0527 2013-03-11 16:09:41

+1

您的「選擇」方法沒有做任何事情;它應該被刪除。 – Servy 2013-03-11 16:28:11

回答

3

WriteAllLines需要一個string[]作爲其第二個參數,而你傳遞一個IEnumerable<string>IEnumerable<string>可以指代string[],但也可以指代也實施IEnumerable<string>的任何其他類型。

這應該工作:

File.WriteAllLines(oFileName, stringsOut.ToArray()); 
+0

「在這種特殊情況下,IEnumerable 碰巧指向一個字符串[],」我不能同意這個說法。 'stringsOut'變量根本不引用'string []'。 – juharr 2013-03-11 16:10:29

+0

@juharr:好的!有人可能會說,我在寫這篇文章的時候正在重新思考這個問題,並且在我的大腦中出現了併發問題。將及時更正。 – 2013-03-11 16:12:02

+0

我用這一個 – 2013-03-12 15:50:56

2

你編譯哪個版本的.NET的呢?接受IEnumerable<string>作爲第二個參數的WriteAllLines超載直到.Net 4.0才被添加。該方法存在於3.0中,但只有以string[]作爲第二個參數的超載。

1

雖然您正在執行ReadAllLines,但您正在應用LINQ過濾器,它將其轉換爲IEnumerable<string>

試着改變你的代碼,類似

IEnumerable<string> stringsOut = File.ReadAllLines(iFileName) 
        .Where(line => (char.IsDigit(line, 0)) && line.Contains(",")) 
        .Select(line => line) 
        .ToArray(); 
1

的最佳重載匹配 'System.IO.File.WriteAllLines(字符串,字符串[])'

我想你低於.NET 4,WriteAllLinesIEnumerable<string>在.NET 4中是新的。

所以只需使用陣列版本:

string[] stringsOut = File.ReadAllLines(iFileName) 
    .Where(line => (char.IsDigit(line, 0)) && line.Contains(",")) 
    .Select(line => line) 
    .ToArray(); 
File.WriteAllLines(oFileName, stringsOut); 
1

File.WriteAllLines確實需要字符串數組作爲第二個參數,而不是一個串的方法

+1

[File.WriteAllLines](http://msdn.microsoft.com/en-us/library/92e05ft3.aspx)將'string []'作爲第二個參數。這裏的「不」是無意的嗎? – Default 2013-03-11 16:11:30

+0

是的,我不打算在那裏輸入'not'。謝了哥們 – RaM 2013-03-11 16:17:13