2

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

编辑:让它工作,看看我的答案

4

3 回答 3

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();
于 2012-09-20T19:55:58.090 回答
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实例的分组值(因为它们都将共享相同的高度)。IsTesttrue

于 2012-09-20T19:30:40.450 回答
-1

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

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

因此,如果有一个 Person 具有属性,IsTest = false那么它也person.Height用于分组。

于 2012-09-21T06:56:30.673 回答