C# 将Datatable转换为ienumerable<;匿名>;?

C# 将Datatable转换为ienumerable<;匿名>;?,c#,collections,ienumerable,C#,Collections,Ienumerable,是否可以在不知道其类名的情况下将数据表转换为ienumerable 我的要求是转换表 First | Last -------------- john | mcgill clara | linda 到 Ienumerable集合 我不想使用动态对象,因为动态对象只支持框架4 谢谢var results=来自dataTable.AsEnumerable()中的行 var results = from row in dataTable.AsEnumerable()

是否可以在不知道其类名的情况下将数据表转换为ienumerable

我的要求是转换表

First | Last
--------------
john  | mcgill
clara | linda   

Ienumerable集合

我不想使用动态对象,因为动态对象只支持框架4

谢谢

var results=来自dataTable.AsEnumerable()中的行
var results = from row in dataTable.AsEnumerable()
              select new {
                  First = row.Field<string>("First"),
                  Last = row.Field<string>("Second")
              };
选择新的{ First=行字段(“First”), 最后一行=第二行字段(“第二行”) };
您需要可以使用的
System.Data.DataSetExtensions

-它们是在.NET3.5中引入的

此类对象的语法非常清晰直观:

var item = new { First = "First-Value", Last = "Last-Value" }
以及查询:

var items = dataTable.AsEnumerable()
                     .Select(i => new {
                                           First = i.Field<string>("First"),
                                           Last= i.Field<string>("Last")
                                      });
var items=dataTable.AsEnumerable()
.选择(i=>new{
First=i.字段(“First”),
Last=i.字段(“Last”)
});

使用匿名类型是一项相当简单的工作。下面是一个完整的示例,它只需要System.Linq和System.Data命名空间中的类:

  class Program
  {
    static void Main(string[] args)
    {
      DataTable dataTable = new DataTable();
      dataTable.Columns.Add().ColumnName = "First";
      dataTable.Columns.Add().ColumnName = "Last";
      var row = dataTable.NewRow();
      row["First"] = "hello";
      row["Last"] = "world";
      dataTable.Rows.Add(row);

      var query = dataTable.Rows.Cast<DataRow>()
        .Select(r => new
        {
          First = r["First"],
          Last = r["Last"]
        });

      foreach (var item in query)
        Console.WriteLine("{0} {1}", item.First, item.Last);
    }
  }
类程序
{
静态void Main(字符串[]参数)
{
DataTable=新的DataTable();
dataTable.Columns.Add().ColumnName=“First”;
dataTable.Columns.Add().ColumnName=“Last”;
var row=dataTable.NewRow();
行[“第一”]=“你好”;
行[“最后”]=“世界”;
dataTable.Rows.Add(行);
var query=dataTable.Rows.Cast()
.选择(r=>new
{
First=r[“First”],
Last=r[“Last”]
});
foreach(查询中的var项)
WriteLine(“{0}{1}”,item.First,item.Last);
}
}

请不要列名称

    public string ConvertDataTableToString(DataTable table)
    {
        int iColumnCount = table.Columns.Count;
        int iRowCount = table.Rows.Count;
        int iTempRowCount = 0;
        string strColumName = table.Columns[0].ColumnName;
        string strOut = "{";
        foreach (DataRow row in table.Rows) 
        {
            strOut = strOut + "{";
            foreach (DataColumn col in table.Columns)
            {
                string val = row.Field<string>(col.ColumnName);
                strOut = strOut + col.ColumnName + ":" + val;

                if (col.Ordinal != iColumnCount - 1)
                {
                    strOut = strOut + ",";
                }
            }
            strOut = strOut + "}";
            iTempRowCount++;

            if (iTempRowCount != iRowCount)
            {
                strOut = strOut + ",";
            }
        }
        strOut = strOut + "}";
        return strOut;
    }
公共字符串ConvertDataTableToString(DataTable)
{
int iColumnCount=table.Columns.Count;
int iRowCount=table.Rows.Count;
int iTempRowCount=0;
字符串strColumName=table.Columns[0]。ColumnName;
字符串strOut=“{”;
foreach(table.Rows中的DataRow行)
{
strOut=strOut+“{”;
foreach(table.Columns中的数据列col)
{
字符串val=行字段(列名称);
strOut=strOut+col.ColumnName+“:”+val;
如果(列序号!=iColumnCount-1)
{
strOut=strOut+“,”;
}
}
strOut=strOut+“}”;
iTempRowCount++;
if(iTempRowCount!=iRowCount)
{
strOut=strOut+“,”;
}
}
strOut=strOut+“}”;
回程行程;
}

是的,我知道这种方法,但根据我的要求,我在编译时不知道列名。只有在运行时我才知道还有其他方法吗?我的头撞到了他this@YogeshWaran如果在编译时不知道列的名称,则无法使匿名类型的字段名与列名匹配。编译器生成匿名类型,因此需要知道字段名。一种方法是使用反射发射在运行时生成类型;你可以在这里读到:@YogeshWaran:不,那是不可能的。根据您在评论中所说的,您不能使用匿名类型。编译器在编译时发出匿名类型;要使用它们,您必须在编译时知道它们的名称。根据您的要求,您不能使用dynamic。因此,使用属性包集合。是的,我知道这种方法,但根据我的要求,我在编译时不使用列名。我将只在运行时知道列名并选择新对象属性—请阅读您的注释。你需要这个做什么?它是可视化的吗(例如网格视图)?@Alan:是的,我需要它来显示网格视图。如果是这样的话,你真的不能使用匿名类型。如果您使用的是WPF,是否将DataTable连接到AutoGenerateColumns=true的标准WPF DataGrid?做您想做的事?只是添加此项以测试列值是否为空:string val=row.Field(col.ColumnName);更改为(使用vb.net)Dim val,因为字符串=字符串。如果不是IsDBNull(行(col.ColumnName)),则val=行(col.ColumnName)
    public string ConvertDataTableToString(DataTable table)
    {
        int iColumnCount = table.Columns.Count;
        int iRowCount = table.Rows.Count;
        int iTempRowCount = 0;
        string strColumName = table.Columns[0].ColumnName;
        string strOut = "{";
        foreach (DataRow row in table.Rows) 
        {
            strOut = strOut + "{";
            foreach (DataColumn col in table.Columns)
            {
                string val = row.Field<string>(col.ColumnName);
                strOut = strOut + col.ColumnName + ":" + val;

                if (col.Ordinal != iColumnCount - 1)
                {
                    strOut = strOut + ",";
                }
            }
            strOut = strOut + "}";
            iTempRowCount++;

            if (iTempRowCount != iRowCount)
            {
                strOut = strOut + ",";
            }
        }
        strOut = strOut + "}";
        return strOut;
    }