C# 将Datatable转换为ienumerable<;匿名>;?
是否可以在不知道其类名的情况下将数据表转换为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()
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;
}