我有通用列表foo,如下所示
var foo = new List<XYZ>();
public class XYZ
{
public String TimeZone { get; set; }
public Decimal? B1Volume { get; set; }
public Decimal? B2Volume { get; set; }
public Decimal? B3Volume { get; set; }
public Decimal? B4Volume { get; set; }
public Decimal? B5Volume { get; set; }
// .............
// .............
public Decimal? B24Volume { get; set; }
public String Name {get;set;}
}
如何选择属性B1Volume,........B24Volume ?
我尝试使用下面提到的代码,但它没有给出预期的结果
var hp = foo.Skip(1).Take(23).ToList();
答案 0 :(得分:1)
有几种方法,但我认为你不想走这条路。 你真的想要一份xyz列表吗?或者以不同的方式问:你有很多不同的卷列表吗?或者您只想表达一个卷列表?
也许您想要做的是在XYZ中声明一个像这样的数组
public class XYZ
{
public String TimeZone { get; set; }
public Decimal?[] Volumes {get; set;} = new Decimal?[24];
public String Name {get; set;}
}
如果要通过索引(1,2,...,24)访问卷,则需要一个数组或任何其他类型的索引数据结构。
然后你可以做
var xyz = new XYZ();
xyz.Volumes[0] = 12.0;
xyz.Volumes[1] = 23.0;
.....
并且基本上通过xyz.Volumes访问卷并添加索引以获得第n个卷
如果您现在想要进一步列出这些XYZ,您可以执行以下操作:
var listOfXyz = new List<XYZ>();
listOfXyz.Add(new XYZ());
....
listOfXyz[3].Volumes
这将为您提供列表中索引为3的24卷元素。
答案 1 :(得分:1)
您需要执行Select
:
var hp = foo.Select(x => new { x.BVolume1, x.BVolume2, ..., x.BVolume24 });
虽然我同意@Himzo,如果你能改变结构,这不是解决问题的最佳方法。
答案 2 :(得分:0)
也许有帮助:
XYZ xyz = new XYZ();
Type t = xyz.GetType();
List<PropertyInfo> properties = new List<PropertyInfo>(t.GetProperties());
var hp = properties.Skip(1).Take(23).ToList();
不要忘记添加名称空间:
using System.Reflection;
<强>更新强>
在评论中,GBreen12建议添加一个过滤器,仅用于获取名称中包含volume
的属性。现在,如果添加其他属性,代码将不会失败。所以你可以将第3行更改为:
List<PropertyInfo> properties = (new List<PropertyInfo>(t.GetProperties())).Where(x => x.Name.EndsWith("Volume")).ToList();
现在您不需要上一行var hp = ...
,而properties
就是您的答案。