GroupBy与三元运算符

时间:2012-09-20 19:23:28

标签: c# linq group-by

我有一个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();

编辑:让它发挥作用,看看我的答案

3 个答案:

答案 0 :(得分:2)

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

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();

答案 1 :(得分:0)

由于编译器无法找出GroupBy调用的返回类型(因为它实际上是两种不同的类型),因此不能将三元组作为组的一部分使用。

您可以将逻辑嵌入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; }
  public double GroupProperty { get { return IsTest ? 0.0 : Height } }
}

var groupedPersons = persons.GroupBy(person =>
  new {
        person.Name,
        person.Age,
        person.Address,
        person.GroupByProperty
  }).ToList();

这会将Height属性作为所有Person个实例的分组值消除,IsTest设置为true(因为它们都将共享相同的高度)。< / p>

答案 2 :(得分:-1)

好的,在尝试了这里显示的一些例子之后,我意识到这不会起作用,我让它以其他方式工作。这是我如何做到的一个例子:

var groupedPersons = 
       persons.GroupBy(
                 person =>
                      person.Name + "|" +
                      person.Age.ToString() + "|" +
                      person.Address + "|" +
                      (person.IsTest ? null : person.Height.ToString())
      .ToList();

因此,如果有人具有属性IsTest = false,那么它也会使用person.Height进行分组。