我只是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
答案 0 :(得分:9)
var
不是一种类型。这是一个关键词,意思是“为我填写类型”。
Where
返回一个集合。您正在尝试将集合转换为单个项目。
而不是Where
,请使用FirstOrDefault
。
var itemsMax = lt.FirstOrDefault(xa => xa.Similarity == wwe);
现在你得到一个项目,如果需要可以投射它。
如果您只想要一个具有该值的项目,请注意上述情况。
如果可能有多个具有最大值的项目 - 并且您希望返回多个项目 - 请将Where
与OfType
或Cast
合并。
var itemsMax = lt.Where(xa => xa.Similarity == wwe);
var allItemsCasted = itemsMax.Cast<NewType>(); // this throws
var typeCompatibleItems = itemsMax.OfType<NewType>(); // this filters
答案 1 :(得分:2)
问题似乎是Where
返回一个对象集合,但您只需要一个对象。试试itemsMax.Single()
答案 2 :(得分:1)
不是枚举matchings
两次(一次计算“最大相似度”,而是第二次查找具有最大相似度的项目),您可以使用{{1}一次完成此操作}:
IEnumerable<T>.Aggregate
答案 3 :(得分:0)
您的lt.Where
会返回一个可枚举的内容。所以,这就是为什么它不会转换为单个对象。最后添加一个.Single()
方法,它应该强制转换。