使用 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
就是您的答案。
我有如下所示的通用列表 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
就是您的答案。