1

我只是 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
4

4 回答 4

9

var不是类型。这是一个关键字,意思是“为我填写类型”。

Where返回一个集合。您正在尝试将集合转换为单个项目。

而不是Where,使用FirstOrDefault.

var itemsMax = lt.FirstOrDefault(xa => xa.Similarity == wwe);

现在你得到一个单一的项目,并且可以在需要时施放它。

请注意,如果您只想要具有该值的单个项目,则上述方法有效。

如果有可能有多个具有最大值的项目——并且你想要多个项目返回——WhereOfTypeor结合Cast

var itemsMax = lt.Where(xa => xa.Similarity == wwe); 
var allItemsCasted = itemsMax.Cast<NewType>(); // this throws
var typeCompatibleItems = itemsMax.OfType<NewType>(); // this filters
于 2012-06-29T11:04:40.253 回答
2

问题似乎是Where返回对象的集合,但您只需要一个对象。尝试itemsMax.Single()

于 2012-06-29T11:04:25.963 回答
1

而不是通过matchings两次枚举(一次计算“最大相似性”,第二次找到具有最大相似性的项目),您可以使用以下方法一次性完成此操作IEnumerable<T>.Aggregate

var sm = matchings.Aggregate((maxItem, next) => 
            next.Similarity > maxItem.Similarity ? next : maxItem);
于 2012-06-29T11:20:54.923 回答
0

lt.Where返回一个可枚举的。所以,这就是为什么它不会投射到单个对象。最后添加一个.Single()方法,它应该强制转换。

于 2012-06-29T11:05:06.327 回答