Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有if-else条件的Linq GroupBy对象_C#_Linq - Fatal编程技术网

C# 具有if-else条件的Linq GroupBy对象

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

我是c林克的新手,正在为一些事情挣扎。 我有一个列表,希望从中收集特定信息,如下例所示:

假设我有以下kidsEat对象列表:

从这个列表中,我想知道每个男孩是否吃了东西

如果他真的吃了什么东西,它会以说他吃的东西为准

如果他不吃东西,它会在他不吃的地方随机选取一个物体

因此,此示例应返回以下2个对象的列表:

{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(),
    });