C# datarow对象的匿名类型无效
我想从数据行中选择一些字段,例如:C# datarow对象的匿名类型无效,c#,linq,.net-3.5,anonymous-types,datarow,C#,Linq,.net 3.5,Anonymous Types,Datarow,我想从数据行中选择一些字段,例如: var result = datatable.AsEnumerable() .Select(x => new { x.Field<string>("Field1"), x.Field<string>("Field2")}); 我们可以做到以下几点: var result = datatable.AsEnumerable() .Select(x => new MyClass(x.Field<string
var result = datatable.AsEnumerable()
.Select(x => new { x.Field<string>("Field1"), x.Field<string>("Field2")});
我们可以做到以下几点:
var result = datatable.AsEnumerable()
.Select(x => new MyClass(x.Field<string>("Field1"), x.Field<string>("Field2")));
您需要输入属性的名称:
var result = datatable.AsEnumerable()
.Select(x => new
{
Field1 = x.Field<string>("Field1"),
Field2 = x.Field<string>("Field2")
});
编译器不知道如何从x.field1之类的东西推断名称。但这是可行的:
int id = 1;
string name = "Myname";
var obj = new { id, name }; // Names are inferred from the variable name.
var result = obj.name; // This would work
您需要输入属性的名称:
var result = datatable.AsEnumerable()
.Select(x => new
{
Field1 = x.Field<string>("Field1"),
Field2 = x.Field<string>("Field2")
});
编译器不知道如何从x.field1之类的东西推断名称。但这是可行的:
int id = 1;
string name = "Myname";
var obj = new { id, name }; // Names are inferred from the variable name.
var result = obj.name; // This would work
好吧,错误说明了一切,给成员起名字:
var result = datatable.AsEnumerable()
.Select(x => new {
First = x.Field<string>("Field1"),
Second = x.Field<string>("Field2")
});
好吧,错误说明了一切,给成员起名字:
var result = datatable.AsEnumerable()
.Select(x => new {
First = x.Field<string>("Field1"),
Second = x.Field<string>("Field2")
});
您需要为匿名类型的成员提供一些名称
var result = datatable.AsEnumerable()
.Select(x => new {
Field1 = x.Field<string>("Field1"),
Field2 = x.Field<string>("Field2")});
然后您可以分别使用Item1和Item2访问成员
但是,该类是.NET4.0的新类,您的问题标记为3.5
作为对您的评论的回应,您可以声明自己的类型
public class MyPair<TItem1, TItem2>
{
public MyPair(TItem1 item1, TItem2 item2)
{
this.Item1 = item1;
this.Item2 = item2;
}
public TItem1 Item1 { get; private set; }
public TItem2 Item2 { get; private set; }
}
很明显你会这样用
var result = datatable.AsEnumerable()
.Select(x => new MyPair(
Field1 = x.Field<string>("Field1"),
Field2 = x.Field<string>("Field2")));
您需要为匿名类型的成员提供一些名称
var result = datatable.AsEnumerable()
.Select(x => new {
Field1 = x.Field<string>("Field1"),
Field2 = x.Field<string>("Field2")});
然后您可以分别使用Item1和Item2访问成员
但是,该类是.NET4.0的新类,您的问题标记为3.5
作为对您的评论的回应,您可以声明自己的类型
public class MyPair<TItem1, TItem2>
{
public MyPair(TItem1 item1, TItem2 item2)
{
this.Item1 = item1;
this.Item2 = item2;
}
public TItem1 Item1 { get; private set; }
public TItem2 Item2 { get; private set; }
}
很明显你会这样用
var result = datatable.AsEnumerable()
.Select(x => new MyPair(
Field1 = x.Field<string>("Field1"),
Field2 = x.Field<string>("Field2")));
您必须使用反射,并且您将使用什么名称来定位属性…:@gdoron,是的,这些名字很重要。没有元组,只有一个替换,以同样的方式工作,不需要命名任何匿名类型,比如。选择x=>new MyObjectx.FieldFieldField_1,x.FieldFieldField_2您必须使用反射,并且您必须使用什么名称来定位属性…:@gdoron,是的,这些名字很重要。没有元组,只有一个替换,以同样的方式工作,不需要命名任何匿名类型,比如。Selectx=>newmyobjectx.fieldfieldfield_1,x.FieldField_2有一个使用元组的答案,我更喜欢元组,因为我需要将结果集转换为我自己的类。不幸的是,有人删除了答案…为什么您需要一个元组来创建自己的类?我已经在我的答案中添加了一个元组示例,但是,如果您希望,您应该在问题中明确说明。在.Net 3.5I中没有元组,我认为这可能是另一个问题,这就是为什么我没有添加它的原因@马里奥:我不需要一个元组来创建我的类,我只是用带三个参数的类来替换它……有一个答案是使用元组,我更喜欢元组,因为我需要将结果集转换为我自己的类。不幸的是,有人删除了答案…为什么您需要一个元组来创建自己的类?我已经在我的答案中添加了一个元组示例,但是,如果您希望,您应该在问题中明确说明。在.Net 3.5I中没有元组,我认为这可能是另一个问题,这就是为什么我没有添加它的原因@马里奥:我不需要一个元组来创建我的类,我只是用我的类替换了它,它包含三个参数。。。