【问题标题】:How to retrieve an entire column from a data table using it's column name如何使用列名从数据表中检索整个列
【发布时间】:2019-04-11 17:24:09
【问题描述】:

我有一个像这样的数据表

|id | foo | bar |
| 0 | 321 | 33  |
| 1 | 100 |  4  |
| 2 | 355 | 23  |

我想使用列名作为参数来检索整个列

类似

GetColumn(dataTable, "foo")

那会返回

| foo | 
| 321 | 
| 100 | 
| 355 |

有什么可以做到的吗?

【问题讨论】:

  • 请向我们展示您的尝试,以便我们更好地为您提供帮助。
  • 您希望GetColumn 提供什么数据类型?你能为GetColumn写一个声明吗?你的数据表真的是DataTable吗?
  • dataTable.Rows.Cast<DataRow>().Select(row => row["foo"]).ToList()

标签: c# datatable datacolumn


【解决方案1】:

尝试以下 linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication108
{
    class Program
    {

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();

            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("foo", typeof(int));
            dt.Columns.Add("bar", typeof(int));

            dt.Rows.Add(new object[] { 0 , 321 , 33  });
            dt.Rows.Add(new object[] { 1 , 100 , 4  });
            dt.Rows.Add(new object[] { 2 , 355 , 23  });

            List<int> results = dt.AsEnumerable().Select(x => x.Field<int>("foo")).ToList();

        }
    }
}

【讨论】:

  • 如果用户想在其他地方添加这个怎么办,你知道叫它;具有指定的对象/数据表和列名?
  • 这与答案无关。
  • I want to retrive an entire column using the column name as an argument 很明显它是......目前这不能在任何地方重复使用......
  • @Çöđěxěŕ OP询问是否有类似GetColumn(DataTable Table, string ColumnName)的东西。而且没有。这个答案完全符合 OP 的要求,它给出了给定列的值列表。如果用户想要更多功能,这取决于他们。
  • @Çöđěxěŕ 那么解决方案是否决这个问题。这个答案没有错,因为这个问题可能清楚也可能不清楚。根据给出的信息,这是一个可以接受的解决方案。发帖人也不能在回答之前验证 OP 的语言能力。此外,任何不了解 Linq 基础知识的 .NET 开发人员都应该放下一切去学习它们。 C# 几乎是一种不同的语言,有和没有 Linq(有点夸张,但不是很多)。
【解决方案2】:

不完全是。但你可以这样做:

private List<string> GetColumnValues(string columnName, DataTable dataTable)
{
    var colValues = new List<string>();
    foreach (DataRow row in datatable.Rows)
    {
        var value = row[columnName];
        if (value != null)
        {
            colValues.Add((string)value);
        }
    }
    return colValues;
}

如果您想要一些可以与其他原始类型(int、decimal、bool 等)一起使用的东西,您可能需要阅读 C# generics 并实现一个通用方法。

【讨论】:

  • 请在发布解决方案之前测试代码。另外恕我直言,OP 需要提供更多信息,以便我们真正帮助他们找出他们做错了什么。
  • 对不起,现在意识到......我不适合写整个事情。但是那段代码有什么问题呢?
  • what is wrong with that code,它不起作用...列表没有最初初始化,当row["colName"]为空时会发生什么,是否有可能列可能有重复的字符串等...?另外,看起来用户有int 值,你为什么要声明List&lt;string&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多