DataTable中的FileNames - 第一列

时间:2013-07-08 10:12:01

标签: c# datatable .net system.io.directory

有没有办法在不使用FileNames循环的情况下在DataTable中获取foreach的列表?

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;

3 个答案:

答案 0 :(得分:0)

  1. 将DataTable对象转换为Enumerable()。
  2. 应用带有列名称的select子句作为字段名称。
  3. 将其投射到字符串数组。

     string[] strSummCities = dtTemp1.AsEnumerable().Select(s => s.Field<string>("City")).ToArray<string>();
    
  4. 希望这有助于解决您的疑问。

答案 1 :(得分:0)

您应该添加对System.Data.DataSetExtension的引用,以便CopyToDataTable()获取可枚举的值,之后您可以使用:

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

答案 2 :(得分:0)

Linq隐藏了你的循环,它仍然使用它们:

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

但是,当你已经有一个也是内存中集合的表时,为什么还要一个列表呢?

如果您想将这些文件名放在另一条多线TextBox中,您可以使用:

txtBoxWriteTo.Lines = dtOutput.AsEnumerable()
     .Select(r => r.Field<string>("FileName"))
     .ToArray();