使用linq获取通用列表中的特定属性

时间:2017-11-01 20:32:36

标签: c# linq generic-list

我有通用列表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();

3 个答案:

答案 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就是您的答案。