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

标签 c# linq anonymous-types

我有这个列表:

安妮 - 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())

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

关于c# - 获取列表中的最后一个元素(基于名称) - LINQ C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8844901/

相关文章:

c# - 如何将使用 zooz ios sdk 的 zooz 支付网关集成到 xamarin ios 应用程序中?

c# - Rebus 和 WebApi

c# - 如果在 View 构造函数中填充,ObservableCollection<T> 会触发 SelectionChanged 事件

c# - 如何使用关键字作为属性名称?

c# - 我应该使用什么 gulp 插件在 Mac 上构建 ASP.NET 5?

c# - C#/ Entity Framework 中的 LINQ 表达式

c# - Func 或 Predicate 到 ExpressionTree

c# - 从列表中获取通用数据

c# - 如何在 SQL 2008 中执行 Linq select new with datetime

c# - 在 View 中访问动态匿名类型时出现 RuntimeBinderException