【问题标题】:How to get the columns index from datatable which column name contains like 'ColumnName'如何从数据表中获取列名包含的列索引,如“ColumnName”
【发布时间】:2017-02-08 16:40:40
【问题描述】:

我有一个包含动态创建的列的数据表:

Name | Role | Comm w1 | Role | Comm w2 | .... | Total Comm |

我想获取包含Comm 的所有列索引。

预期的结果应该是:

2
4
...

【问题讨论】:

  • 请提供您尝试过的代码。我们是来帮助的,而不是为你做你的工作。

标签: c# linq lambda datatables


【解决方案1】:

您可以使用 LINQ 相当轻松地做到这一点。

首先,我们需要将 Columns 转换为 DataColumn,因为 LINQ 需要它是 IEnumerable<DataColumn> 但 Columns 是 DataColumnCollection。然后将列限制为包含“Comm”的列,然后选择每列的序号,然后将其列成一个列表。

List<int> columnIndexes = dt.Columns.Cast<DataColumn>()
    .Where(column => column.ColumnName.Contains("Comm"))
    .Select(column => column.Ordinal).ToList();

【讨论】:

    【解决方案2】:

    您的问题不清楚您希望输出是什么,您是否只是想将列的位置打印到屏幕上,或者以某种方式存储它们以供以后使用。

    此外,这是一个非常简单的解决方案。如果不是这样,那么我将不会参与。因此,为了将来参考,请提供您尝试过的内容和期望的内容。它可以帮助所有参与尝试帮助您找到解决方案的人。如果遇到任何问题,请参考"How to ask a good question"

    using System;
    using System.Data;
    using System.Xml;
    
    public class Program
    {
        public static void Main()
        {
            var dt = new DataTable { Columns = { "Name", "Role", "Comm w1", "Comm w2",  "Total Comm"}};
    
    
            foreach(DataColumn column in dt.Columns){
                if(column.ColumnName.Contains("Comm")){
                    Console.WriteLine(column.Ordinal.ToString());
                }
            }
        }
    }
    
    
    // Output:
    
    // 2
    // 3
    // 4
    

    如果这有帮助,请告诉我。

    【讨论】:

    • 感谢您的回答。我知道这是一个简单的问题,但我只是询问如何获取包含 ColumnName 的列的索引。完成此操作后,我可以决定是否要打印它们或存储在 List 中,但这不是问题。
    【解决方案3】:

    下面应该做你需要的

    foreach (DataColumn col in dataTable.Columns)
    {
           if (col.ColumnName.Contains("Comm"))
           {
             var index = col.Ordinal;          
           }
     }
    

    但如前所述,最好先尝试一下。

    【讨论】:

    • 这不太好,变量应该在循环外声明并且可能是一个列表,所以你可以使用listIndex.add(col.Ordinal); 这样循环之后值仍然可以访问,并且你有所有这些,由于范围问题,一旦 if 完成,您的代码索引就会丢失。
    • @Andrew 根据用户所说的他们想要的..根本不需要存储值.. OP 只想将列的索引位置打印到屏幕上.. 不保存 可能进一步操作。
    • @BviLLe_Kid 说实话,这个问题远不是最好的问题,他们从来没有以任何方式指定他们的输出需求,但是 Wheels73 的解决方案不输出或保存,它设置了值只要范围存在,不长。
    • @Andrew 我同意。我只是简单地指出,技术上我们的答案都不正确,因为 OP 无法明确提供他们想要的结果。
    • @BviLLe_Kid 我犯了最大用处的错误,假设他们稍后会想要使用这些索引来访问这些列中的数据,但是是的,OP 确实需要阅读此处关于如何询问的指南一个问题。
    【解决方案4】:

    其他答案是正确的,它会得到你想要的,但我不认为他们如何使用它们是完全正确的。我会这样做:

    List<int> indexes = new List<int>();
    foreach (DataColumn column in dataTable.Columns)
    {
        if (column.ColumnName.Contains("Comm"))
        {
          indexes.Add(column.Ordinal);          
        }
    }
    

    这样,您之后就可以根据需要使用索引列表了。

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 2021-11-06
      • 2019-09-24
      • 2011-03-29
      • 1970-01-01
      • 2020-09-21
      • 1970-01-01
      • 2015-10-02
      • 2023-04-08
      相关资源
      最近更新 更多