我有一个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();
编辑:让它发挥作用,看看我的答案
答案 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
进行分组。