利用Q& As处理循环对象的属性(https://stackoverflow.com/questions/15586123/loop-through-object-and-get-properties,Loop Through An Objects Properties In C#),您可以在哪里:
你好吗:
请在下面找到相关课程的粗略地图。
我一直试图使用LINQ查询但没有成功。任何想法或指导都将不胜感激。
class MainClass {
List<Class1> listObj1
}
class Class1 {
// a number of fields including...
int PropertyA { get; set; }
int PropertyB { get; set; }
Dictionary<int, Class2> dictObj2 { get; set; }
}
class Class2 {
// a number of fields all of type double...
double MeasurementA { get; set; }
double MeasurementB { get; set; }
double MeasurementC { get; set; }
}
答案 0 :(得分:1)
有效地确定内部类的属性(Class 2)
无论效率如何,实际上只有一种方法可以做到(假设你的意思是在运行时)并使用反射。
循环遍历内部类的属性(Class 2)
foreach (var prop in instance.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine(prop.Name);
}
循环遍历Class1对象的集合(listObj1),选择Class2属性的所有实例
foreach (var obj in mainClass.listObj1)
{
var innerClasses = obj.dictObj2.Values;
// do something with inner classes
}
输出Class2属性的集合(例如,第一次迭代将返回MeasurementA的集合,每个Class1对象中有一个)。
foreach (var prop in typeof(Class2).GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
foreach (var obj in mainClass.listObj1)
{
foreach (var innerClass in obj.dictObj2.Values)
{
Console.WriteLine(prop.GetValue(innerClass, null));
}
}
}
不确定为什么你如此热衷于在这里使用LINQ,我认为这里只需要几个简单的for
循环。
答案 1 :(得分:1)
鉴于数据:
MainClass mainClass = new MainClass();
mainClass.listObj1 = new List<Class1>()
{
new Class1() {
dictObj2 = new Dictionary<int,Class2>() {
{ 1, new Class2() { MeasurementA = 2.0, MeasurementB = 3.0, MeasurementC = 4.0 }},
{ 2, new Class2() { MeasurementA = 5.0, MeasurementB = 6.0, MeasurementC = 7.0 }}
}
}
};
你可以用LINQ编写:
var fields = typeof(Class2)
// Get Properties of the ClassB
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
// Map each PropertyInfo into collection of its values from c1.dictObj2
.SelectMany(pi => mainClass.listObj1
.SelectMany(c1 => c1.dictObj2)
.Select(p => new
{
Property = pi.Name,
Value = pi.GetValue(p.Value)
}))
// Group data with respect to the PropertyName
.GroupBy(x => x.Property, x => x.Value)
// And create proper dictionary
.ToDictionary(x => x.Key, x => x.ToList());
现在您有一个Dictionary
,其ClassB
个属性名称和值的键为这些属性值的List
。