使用LINQ循环外部类集合中的内部类属性

利用Q&As处理循环对象的属性( https://stackoverflow.com/questions/15586123/loop-through-object-and-get-properties , 循环通过C#中的对象属性 ),您可以在其中:

  • Class1对象的集合(即listObj1)
  • 每个Class1包含一个Class2对象的集合(即dictObj2)

你好吗?

  • 有效地确定内部类的属性(Class2)
  • 循环遍历内部类的属性(Class2)
  • 循环遍历Class1对象的集合(listObj1),选择Class2属性的所有实例
  • 输出Class2属性的集合(例如,第一次迭代将返回MeasurementA的集合,每个Class1对象一个)。
  • 并按Class1.PropertyA和Class1.PropertyB对集合进行分组

请在下面找到所涉及课程的粗略地图。

我一直试图使用LINQ查询但没有成功。 任何想法或指导将不胜感激。

class MainClass { List listObj1 } class Class1 { // a number of fields including... int PropertyA { get; set; } int PropertyB { get; set; } Dictionary 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; } } 

鉴于数据:

 MainClass mainClass = new MainClass(); mainClass.listObj1 = new List() { new Class1() { dictObj2 = new Dictionary() { { 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()); 

现在你有一个包含ClassB属性名称和值的Dictionary作为这些属性值的List

有效地确定内部类的属性(Class 2)

无论效率如何,实际上只有一种方法可以做到(假设你的意思是在运行时)并且使用reflection。

循环遍历内部类的属性(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循环。