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

本文关键字:于名 -LINQ 列表 最后一个 元素 获取 | 更新日期: 2023-09-27 18:20:14

我有这个列表:

安妮-p
五月-"
安妮-P
五月-P

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

安妮-p
五月-P

我有这段代码,但它要么抛出错误:The type arguments for method 'System.Linq.Enumerable.SelectMany<TSource,TResult>(System.Collections.Generic.IEnumerable<TSource>, System.Func<TSource,System.Collections.Generic.IEnumerable<TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.,要么我只得到列表中的最后一个元素(May-p)。

class Passenger
{
    public string Name { get; set; }
    public int PassengerID { get; set; }
    public List<TravelDoc> TravelDocs { get; set; }
}
class TravelDoc
{
    public string DocType { get; set; }
    public int? DocNumber { get; set; }
}
List<Passenger> modList = new List<Passenger>()
    {
        new Passenger() { Name = "Annie", PassengerID = 0, 
                          TravelDocs = new List<TravelDoc>()
                          {
                            new TravelDoc() { DocNumber = 100, DocType = "P" }
                          }
                        },
        new Passenger() { Name = "May", PassengerID = 1, 
                          TravelDocs = new List<TravelDoc>()
                          {
                            new TravelDoc() { DocNumber = null, DocType = "" }
                          }
                        },      
        new Passenger() { Name = "Annie", PassengerID = 0, 
                          TravelDocs = new List<TravelDoc>()
                          {
                            new TravelDoc() { DocNumber = 100, DocType = "P" }
                          }
                        },
        new Passenger() { Name = "May", PassengerID = 1, 
                          TravelDocs = new List<TravelDoc>()
                          {
                            new TravelDoc() { DocNumber = 200, DocType = "P" }
                          }
                        }
    };      

代码(抛出错误)

var passengersMod = modList.SelectMany(pax => pax.TravelDocs         
                    .Select(doc => new { Passenger = pax, TravelDoc = doc })
                    .Last())
                    .Dump();

代码(错误结果)

var passengersMod = modList.SelectMany(pax => pax.TravelDocs         
                    .Select(doc => new { Passenger = pax, TravelDoc = doc })
                    ).Last()
                    .Dump();

注意:Dump()是一个LINQPad扩展。:D

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

提前谢谢。

编辑:

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

另一个编辑:

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

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

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

在我提出这个问题多年后,乔恩的回答仍然对我有帮助。我多么希望我能两次支持他的回答!我希望这能帮助其他人D

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

为什么不忽略匿名类型和SelectMany,只执行:

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

根据你的标题,这与匿名类型无关,但它确实会产生你在问题开始时提到的那种结果。

首先,SelectMany用于将多个集合聚合为一个集合。考虑将IEnumerable<IEnumerable<int>gt;转换为单个IEnumerable<int>。因此无法推断用法,因为Last方法将返回一个不表示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();