【问题标题】:Accessing the List-Property of a DataColumnCollection of a DataTable访问 DataTable 的 DataColumnCollection 的列表属性
【发布时间】:2022-01-22 19:01:33
【问题描述】:

我正在尝试访问 DataTableDataColumnCollectionList-属性,但似乎没有。访问是必要的,因为在从 DataTable 中提取后,我需要处理一组字符串(“Format”)。

Microsoft 的文档说,它可以通过 DataTable 的列 (https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=net-6.0) 访问,但事实并非如此。

foreach (object item in dataTable.Columns.List)  // .List is marked as error
{
    Console.WriteLine("TEST: " + item.Format);   // .Format (is string) is marked as error
}

我知道 List-Property 至少是可获取的,这就是我所需要的。我相信我在这里遗漏了一些非常明显的东西......有什么想法吗?

【问题讨论】:

  • 对象没有格式属性。使用 var 而不是 object,然后 item 将具有 dataTable.Columns.List 中的实际类型。

标签: c# datatable datacolumncollection


【解决方案1】:

DataColumnCollection 派生自 InternalDataCollectionBase 本身就是一个集合,所以你的 dataTable.Columns 本身就是一个列表,你不需要做 columns.List

这是您可以访问每列属性的方式。

DataColumnCollection columns = table.Columns;

// Get the ColumnName and DataType for every column.
foreach(DataColumn dataColumn in columns)
{
    Console.WriteLine(dataColumn.ColumnName);
    Console.WriteLine(dataColumn.DataType);
}

【讨论】:

  • 可能更容易说“因为该类是一个名称以 Collection 结尾的 Microsoft 类,它应该有一个枚举器..” - 因为这些类太老了,并且实现了 IEnumerable,而不是 IEnumerable 他们将元素作为对象给出,编译器在将 foreach 转换为迭代表达式时会编写一个强制转换。这就是为什么 foreach(var x in datatable.Columns) 不能立即工作(x 成为对象并且必须强制转换)
【解决方案2】:

尝试使用 linq

var dtColumn = from item in dataTable.Columns.Cast<DataColumn>()
select item.ColumnName;

【讨论】:

  • 呃,这个真的不需要LINQ
  • (但如果 DataColumn 有 Format 属性,它会正常工作)
【解决方案3】:

看来我找到了答案:

foreach (TableColumn item in dataTable.Columns) 
{
    Console.WriteLine("TEST: " + item.Format);  
}

好像TableColumn类型继承自DataColumn,属性Format可以直接访问。

【讨论】:

  • 如果 datatable.Columns 集合确实包含 TableColumn 实例(无论是什么;DocumentFormat.OpenXml.Spreadsheet.TableColumn 和 System.Windows.Documents.TableColumn 似乎都不是从 DataColumn 继承的),这将起作用, 也不包含 Format 属性)..
  • 顺便说一句,在不知道您已经用一些具有格式的未知类型 TableColumn 填充数据表的情况下,我们将无法得出有用的答案。如果您做的事情不是-standard,让我们知道,以便我们可以针对建议
  • 会做@CaiusJard。我不知道这将是非标准的。感谢您的贡献。
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多