获取列表中的最后一个元素(基于名称)-LINQ C#

获取列表中的最后一个元素(基于名称)-LINQ C#,c#,linq,anonymous-types,C#,Linq,Anonymous Types,我有以下清单: 安妮-p 五月-“” 安妮-P 五月-P 我想根据名称获取最后一个元素: 安妮-p 五月-P 我有这段代码,但它可能抛出了一个错误:无法从用法推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func)”的类型参数。尝试显式指定类型参数。或者我只得到列表中最后一个元素(May-P) 代码(错误结果) 注意:Dump()是LINQPad扩展:D 如何使用LINQ获

我有以下清单:

安妮-p
五月-“”
安妮-P
五月-P

我想根据名称获取最后一个元素:

安妮-p
五月-P

我有这段代码,但它可能抛出了一个错误:
无法从用法推断方法“System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func)”的类型参数。尝试显式指定类型参数。
或者我只得到列表中最后一个元素(May-P)

代码(错误结果)

注意:Dump()是LINQPad扩展:D

如何使用LINQ获得我想要的结果

提前谢谢

编辑:

好吧,似乎大多数人都对“基于姓名”的条件感到困惑。很抱歉,但不幸的是,我想不出更好的词来描述标准(抱歉)。但乔恩·汉娜明白我的意思,所以谢谢!此外,我还按照建议从标题中删除了“匿名类型”。再次感谢!:D

另一次编辑:

我有另一个类似的情况,但略有不同。是的,列表是根据一些标准(在本例中是按名称)分组的,但是我需要的不是每个分组中的最后一项,而是每个分组中的第n项

我能够从每个分组中得到第n个:

modList.GroupBy(p => p.Name).Select(g => g.ToList()[index])

在我问这个问题多年后,乔恩的回答仍然对我有帮助。我多么希望我能两次否决他的答案!我希望这能帮助别人D

首先,SelectMany用于将多个集合聚合为一个集合。考虑将一个IEnumerable转换为一个IEnumerable。因此无法推断用法,因为最后一个方法将返回不表示IEnumerable对象的单个元素。现在我不太明白“基于名称的最后一个元素”是什么意思,但如果您想获得集合中的最后N个元素,可以执行以下操作:

// This will return the last 2 elements in your collection.
modList.Skip(modList.Count() - 2);

我不确定我是否理解您是如何订购这些商品的,但我认为您试图做到的是:

var passengersMod = modList.SelectMany(
    d => d.TravelDocs, (p, d) => new { Passenger = p, TravelDoc = d })
   .Last()
   .Dump();

为什么不忽略匿名类型并
选择many
,然后执行以下操作:

modList.GroupBy(p => p.Name).Select(g => g.Last())

这与您标题中的匿名类型无关,但它确实会产生您在问题开头提到的那种结果。

这就是我要找的,谢谢!如果你不介意的话,你能解释一下你在这里做了什么吗?我对LINQ预测和聚合非常陌生。为什么需要创建d=>d.TravelDocs?再次感谢。嗯,第二次检查。。。它只返回最后一个元素,即May-P。我需要的是Annie-P和May-P。不过谢谢你的回答:DY您可能会找到更好的信息,但简单的回答是,将每个乘客的旅行文件列表(第一个参数)展平,然后应用结果选择器(第二个参数)以获得最终结果。我认为您需要澄清您想要什么。。你的问题是“我想得到最后一个元素”,但看起来你想要最后两个元素?哦,好的,我会澄清这个问题。谢谢。这是真的,我一开始就考虑过了,但是反向操作会带来反向收集顺序的开销。Skip只是寻找过去的元素。这就是为什么我要用我做的代码。不过,为了完整起见,感谢您添加了以下内容:)我希望您没有阅读我的评论,我认为我的评论与问题无关,所以我将其删除。顺便说一句,我相信开销并没有那么大。在结果集中有更多元素的情况下,开销可能是一个问题。如果集合的计数不是预先计算的值(即:使用枚举器生成结果的可枚举对象),则反转集合然后获取最后几个元素的方法肯定会更快。我知道它不能回答这个问题,但是知道这个信息并没有什么坏处。你能澄清一下你想点什么菜,或者你所说的“基于姓名”到底是什么意思吗?哈哈。我想它实际上帮助我知道,在这个时区,快到睡觉时间了,我回答了大部分问题!:)哈哈。有时,过于深入地理解某个特定问题会让位于忽略表面需求。哈哈。非常感谢!你把我从即将到来的头痛中救了出来PYes,很容易花很长时间使那些“几乎就在那里”的解决方案复杂化,因此一开始就看不到更简单的解决方案。
// This will return the last 2 elements in your collection.
modList.Skip(modList.Count() - 2);
var passengersMod = modList.SelectMany(
    d => d.TravelDocs, (p, d) => new { Passenger = p, TravelDoc = d })
   .Last()
   .Dump();
modList.GroupBy(p => p.Name).Select(g => g.Last())