1

例如,我有这些课程:

public class Person{  
  public string name, surname;  
  public int age;  
  public List<Aspect> aspect; 
}

public class Aspect
{
    public string key;
    public string value;
}

我想要一个 LINQ 表达式在对象中显示这样的数据:

NAME, SURNAME, ASPECT1.KEY, ASPECT2.KEY, ...

换句话说,LINQ 表达式返回一个对象列表,例如:

[0]{name="exampleName1", surname="surname1", age="age1", aspectKey1 = "aspectValue11", aspectKey2 = "aspectValue2", ...}
[1]{name="exampleName2", surname="surname2", age="age2", aspectKey1 = "aspectValue12", aspectKey2 = "aspectValue22", ...}

这可以通过 LINQ 选择实现吗?

4

1 回答 1

9

你可以使用类似的东西:

string ReportPerson(Person person)
{
    return string.Format("{0}, {1}, {2}", person.name, person.surname,
        string.Join(", ", person.aspect.SelectMany(a => new[] {a.key, a.value})));
}

编辑以响应您的编辑:

这是不可能的,因为匿名类型是在编译时定义的。构建出这样一系列属性的 LINQ 查询需要知道在编译时存在多少键和值,以便将数据投影到适当的类型中。

另一种选择可能是将您的数据放入 aDictionary<string,string>中,这将允许您为每个选项输入一个条目:

Dictionary<string,string> ProjectPerson(Person person)
{
    var results = Dictionary<string,string>();
    results.Add("Name", person.name);
    results.Add("Surname", person.surname);
    for (int i=0;i<person.aspect.Count;++i)
    {
         results.Add("aspectKey" + i.ToString(), person.aspect[i].key);             
         results.Add("aspectValue" + i.ToString(), person.aspect[i].value);
    }

    return results;
}

您的目标与此之间的主要区别在于您必须通过以下方式访问每个项目:

string name = projectedPerson["Name"];

而不是能够写:

string name = projectedPerson.Name;

如果您真的想使用最后一个选项, usingdynamic将使这成为可能:

dynamic ProjectPerson(Person person)
{
    dynamic result = new ExpandoObject();
    var results = result as IDictionary<string, object>();
    results.Add("Name", person.name);
    results.Add("Surname", person.surname);
    for (int i=0;i<person.aspect.Count;++i)
    {
         results.Add("aspectKey" + i.ToString(), person.aspect[i].key);             
         results.Add("aspectValue" + i.ToString(), person.aspect[i].value);
    }

    return result;
}

这将允许您编写:

dynamic projected = ProjectPerson(somePerson);

Console.WriteLine(projected.Name);
Console.WriteLine(projected.aspectKey3); // Assuming there are at least 4 aspects in the person
于 2013-06-14T17:00:01.177 回答