2013-07-08 50 views
0

有沒有辦法在不使用foreach循環的情況下獲得FileNames列表中的DataTableDataTable中的文件名 - 第一列

DataTable dtOutput = new DataTable(); 
dtOutput.Columns.Add("FileName", typeof(string)); 
dtOutput.Columns.Add(Col2..., typeof(decimal)); 
... 

foreach (string file in Directory.EnumerateFiles(txtBoxReadFrom.Text, txtBoxTargetFilter.Text)) 
{ 
    dtOutput.Rows.Add(Path.GetFileName(file));     
} 
progressBar1.Maximum = dtOutput.Rows.Count; 
+2

的Linq?但是,然後再次linq內部使用foreach循環.. – Zaki

+3

這樣或那樣..一個循環會發生。 –

+0

@Sam是的我理解LINQ內部使用foreach循環,但你可以寫我的代碼,你將如何使用LINQ? –

回答

0

的LINQ從你隱藏的循環,它使用他們無論如何:

List<String> allFileNames = dtOutput.AsEnumerable() 
    .Select(r => r.Field<string>("FileName")) 
    .ToList(); 

但是,如果您已經擁有也是內存集合的表,您爲什麼還需要一個列表?

如果你想diplays在另一個多這些文件名TextBox你可以使用:

txtBoxWriteTo.Lines = dtOutput.AsEnumerable() 
    .Select(r => r.Field<string>("FileName")) 
    .ToArray(); 
0
  1. 轉換DataTable對象到可枚舉()。
  2. 將select子句與列名作爲字段名應用。
  3. 將其轉換爲字符串數組。

    string[] strSummCities = dtTemp1.AsEnumerable().Select(s => s.Field<string>("City")).ToArray<string>(); 
    

希望這將幫助•解決您的查詢。

0

你應該以有CopyToDataTable()用於枚舉值的引用添加到System.Data.DataSetExtension,在此之後,你可以使用:

DataTable dtOutput = 
     Directory.EnumerateFiles(txtBoxReadFrom.Text, txtBoxTargetFilter.Text).Select(r => 
                 { 
                 DataRow row = dtOutput.NewRow(); 
                 row["fileName"] = r; 
                 return row; 
                 }).CopyToDataTable(); 
+0

感謝您的建議,但不是CopyToDataTable()僅適用於IEnumerable ,其中T是或來自DataRow。 –

+0

我編輯了答案 –

+0

我得到一個IOException - 該源不包含DataRows。 –

相關問題