C# 具有if-else条件的Linq GroupBy对象
我是c林克的新手,正在为一些事情挣扎。 我有一个列表,希望从中收集特定信息,如下例所示: 假设我有以下kidsEat对象列表: 从这个列表中,我想知道每个男孩是否吃了东西 如果他真的吃了什么东西,它会以说他吃的东西为准 如果他不吃东西,它会在他不吃的地方随机选取一个物体 因此,此示例应返回以下2个对象的列表:C# 具有if-else条件的Linq GroupBy对象,c#,linq,C#,Linq,我是c林克的新手,正在为一些事情挣扎。 我有一个列表,希望从中收集特定信息,如下例所示: 假设我有以下kidsEat对象列表: 从这个列表中,我想知道每个男孩是否吃了东西 如果他真的吃了什么东西,它会以说他吃的东西为准 如果他不吃东西,它会在他不吃的地方随机选取一个物体 因此,此示例应返回以下2个对象的列表: {NAME=joseph, FOOD=banana, EATEN=true} {NAME=billy, FOOD=banana, EATEN=false} //banana co
{NAME=joseph, FOOD=banana, EATEN=true}
{NAME=billy, FOOD=banana, EATEN=false} //banana could be switched to apple, it doesn't matter
所以。我想到了这样的事情:
KidsList.GroupBy(kid=>kid.NAME).Where().Select(kid=>kid.First())
但是我不知道在where子句中放什么,因为它就像检查所有的行,然后发现其中一行是否为真,如果为真,则为真,否则为假。感觉需要在LINQ查询中使用一些if-else
有什么帮助吗?选择第一条“已吃”记录,如果没有“已吃”记录,则选择第一条“未吃”记录
KidsList.GroupBy(k => k.NAME)
.Select(g => g.FirstOrDefault(k => k.EATEN) ?? g.First())
说明:如果没有与k=>k.predicate匹配的记录,则FirstOrDefault将返回默认值,即null。在这种情况下,空合并运算符??将计算右侧操作数并返回第一条记录,该记录显然是“未被吃掉的”。您可以按被吃掉的顺序排列组元素,然后选择第一个元素:
var ans = src.GroupBy(e => e.NAME)
.Select(eg => eg.OrderByDescending(e => e.EATEN).First());
一种方法是使用该函数
list.GroupBy(k => k.NAME)
.Select(g => g.Aggregate ((x, y) => x.EATEN && !y.EATEN ? x : y))
要求:
从这个列表中,我想知道每个男孩是否吃了东西。
如果他真的吃了什么东西,它会以说他吃的东西为准。
如果他不吃东西,它会在他不吃的地方随机选取一个物体
如果其中一个男孩吃了不止一种食物怎么办?这是什么意思:拿着说他吃的东西?
让我们把它变成:拿走他吃的任何东西。
如果你确定没有人吃了不止一种食物,那么就没有区别了
对于这一点,你不需要一个Where
首先,你需要知道每个孩子吃过和没吃过的东西。按吃的食物的降序排列:首先吃的食物=真,然后不吃的食物=假。从这一系列食物中,选择第一项
如果孩子至少吃了一件东西,那么第一件东西就是吃过的东西。如果他没有吃任何东西=如果所有已吃的都是假的,那么第一个项目将是未吃的项目
我们将使用具有参数resultSelector的重载。在resultSelector中,我们将按上述方法对Eat的OrderByDescending值执行操作。然后我们将选择第一种食物
IEnumerable<KidsEat> kidsEats = ...
var result = kidsEats.GroupBy(kid => kid.Name,
// parameter resultSelector: for every kid's Name, and all kidsEats with this Name
// make one new object:
(name, kidsEatsWithThisName) => new
{
Name = name,
Food = kidsEatsWithThisName
.OrderByDescending(kidsEat => kidsEat.Eaten)
.Select(kidsEat => kidsEat.Food)
.FirstOrDefault(),
});
换句话说:从kidsEats序列中,将kidsEats分组,并使用相同的名称。从每组制作一个新对象,其属性名称和食物如下:
property Name的值是组的键,它是该组中所有成员的通用名称。
要计算属性食品的值,请通过将属性食品的值降序排列组中的所有KidsEats=all KidsEats,首先是真值,然后是假值。
从这些有序的食物序列中,我们可以看出食物的价值。结果:一系列食物,首先是这个名字的孩子吃的食物,然后是这个孩子没有吃的食物。
从这一系列食物中选出第一项。如果这个孩子没有吃任何东西,那么第一项就是不吃的食物。如果他吃过任何东西,那么第一件东西就是吃过的食物。
简单的问候!
一旦你知道怎么做就不要对属性名称使用所有的大写字母;使用Pascal大小写,如姓名、食物、吃过的东西等。
IEnumerable<KidsEat> kidsEats = ...
var result = kidsEats.GroupBy(kid => kid.Name,
// parameter resultSelector: for every kid's Name, and all kidsEats with this Name
// make one new object:
(name, kidsEatsWithThisName) => new
{
Name = name,
Food = kidsEatsWithThisName
.OrderByDescending(kidsEat => kidsEat.Eaten)
.Select(kidsEat => kidsEat.Food)
.FirstOrDefault(),
});