获取列表中的最后一个元素(基于名称)-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
为什么不忽略匿名类型和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();