我有一个Person对象:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }
    public double Height { get; set; }
    public bool IsTest { get; set; }
}


然后,我有一个列表,其中填充了不同的Person对象。

我想知道是否有一种方法可以根据对象的某些属性在LINQ中对GroupBy使用三元运算符。例如:

var groupedPersons = persons.GroupBy(person => person.IsTest ?
                      new {
                              person.Name,
                              person.Age,
                              person.Address
                           }
                     : new {
                              person.Name,
                              person.Age,
                              person.Address,
                              person.Height}).ToList();


但不幸的是,这行不通,给了我例外


  无法确定条件表达式的类型,因为存在
  在“ AnonymousType#1”和“ AnonymousType#2”之间没有隐式转换


这是完全可以实现的吗?

谢谢

编辑:尝试过此,但不起作用。

var groupedPersons = persons.GroupBy(person => person.OnTest ?
                     new Person {
                                   Address = person.Address,
                                   Name = person.Name,
                                   Age = person.Age }
                     : new Person {
                                   Address= person.Address,
                                   Name = person.Name,
                                   Age = person.Age ,
                                   Height = person.Height}).ToList();


编辑:正常工作,看看我的回答

最佳答案

可以使用匿名对象。您只需要确保它们具有相同的字段名称和字段类型即可:

var groupedPersons = persons.GroupBy(person => person.IsTest ?
                      new {
                              person.Name,
                              person.Age,
                              person.Address,
                              Height = 0
                           }
                     : new {
                              person.Name,
                              person.Age,
                              person.Address,
                              person.Height}).ToList();


编辑:现在,考虑到这一点,您可以在分配Height时使用三元运算符保存一些代码行。如果您担心身高为0的人与测试人分组,则也可以按IsTest分组。

var groupedPersons = persons.GroupBy(person =>
                      new {
                              person.Name,
                              person.Age,
                              person.Address,
                              Height = person.IsTest ? 0 : person.Height,
                              person.IsTest
                           }).ToList();

09-11 18:42