我只是 linq 从对象列表中找到最大对象,现在我想将它从 var 更改回对象。那是怎么做的。
List < MyObject> lt = matchings.ToList();
var wwe = lt.Max(ya => ya.Similarity);
var itemsMax = lt.Where(xa => xa.Similarity == wwe);
MyObject sm =(TemplateMatch) itemsMax;//it gives error here
var
不是类型。这是一个关键字,意思是“为我填写类型”。
Where
返回一个集合。您正在尝试将集合转换为单个项目。
而不是Where
,使用FirstOrDefault
.
var itemsMax = lt.FirstOrDefault(xa => xa.Similarity == wwe);
现在你得到一个单一的项目,并且可以在需要时施放它。
请注意,如果您只想要具有该值的单个项目,则上述方法有效。
如果有可能有多个具有最大值的项目——并且你想要多个项目返回——Where
与OfType
or结合Cast
。
var itemsMax = lt.Where(xa => xa.Similarity == wwe);
var allItemsCasted = itemsMax.Cast<NewType>(); // this throws
var typeCompatibleItems = itemsMax.OfType<NewType>(); // this filters
问题似乎是Where
返回对象的集合,但您只需要一个对象。尝试itemsMax.Single()
而不是通过matchings
两次枚举(一次计算“最大相似性”,第二次找到具有最大相似性的项目),您可以使用以下方法一次性完成此操作IEnumerable<T>.Aggregate
:
var sm = matchings.Aggregate((maxItem, next) =>
next.Similarity > maxItem.Similarity ? next : maxItem);
你lt.Where
返回一个可枚举的。所以,这就是为什么它不会投射到单个对象。最后添加一个.Single()
方法,它应该强制转换。