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

时间:2014-01-14 08:37:12

标签: c# linq

利用Q& As处理循环对象的属性(https://stackoverflow.com/questions/15586123/loop-through-object-and-get-propertiesLoop Through An Objects Properties In C#),您可以在哪里:

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

你好吗:

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

请在下面找到相关课程的粗略地图。

我一直试图使用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; }
}

2 个答案:

答案 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