你可以使用类似的东西:
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