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

get specific properties within the generic list using linq

我有如下所示的通用列表 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;}
}

如何select属性B1Volume,........B24Volume ?

我尝试使用下面提到的代码,但没有给出预期的结果

var hp = foo.Skip(1).Take(23).ToList();

有几种方法,但我认为您不想走那条路。 您真的想要 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 卷。

你需要做一个Select:

var hp = foo.Select(x => new { x.BVolume1, x.BVolume2, ..., x.BVolume24 });

尽管我同意@Himzo 的观点,如果您可以更改结构,这不是解决问题的最佳方法。

也许有帮助:

XYZ xyz = new XYZ();
Type t = xyz.GetType();
List<PropertyInfo> properties = new List<PropertyInfo>(t.GetProperties());
var hp = properties.Skip(1).Take(23).ToList();

不要忘记添加名字 space:

using System.Reflection;

更新

在评论中,GBreen12 建议添加一个过滤器以仅获取名称包含 volume 的属性。现在,如果您添加其他属性,代码将不会失败。所以你可以将第 3 行更改为:

List<PropertyInfo> properties = (new List<PropertyInfo>(t.GetProperties())).Where(x => x.Name.EndsWith("Volume")).ToList();

现在您不需要最后一行 var hp = ...properties 就是您的答案。