2012-06-29 56 views
1

我只是linq從對象列表中找到最大對象,現在我想將它從var改回到對象。這是如何完成的。如何從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

'匹配'是什麼類型? –

+0

matchings,MyObject和TemplateMatch的外觀如何?猜猜你可以簡化你的算法。 – Jocke

+0

a)如果你停止使用var,你的生活將會改善。 b)混合仿製藥和鑄造是一種代碼味道。 –

回答

0

您的lt.Where返回一個枚舉值。所以,這就是爲什麼它不會投射到單個物體上。最後添加一個.Single()方法,它應該投射。

2

問題似乎是Where返回一個對象的集合,但你只需要一個對象。嘗試itemsMax.Single()

9

var不是一種類型。這是一個關鍵詞,意思是「爲我填寫類型」。

Where返回一個集合。您正嘗試將集合投射到單個項目。使用FirstOrDefault代替Where

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

現在你找回一件物品,並且可以在需要時施放它。

注意上面的作品,如果你只想要一個單一的項目與該值。

如果可能有多個項目具有最大值 - 並且您希望多個項目返回 - 請將WhereOfTypeCast結合。

var itemsMax = lt.Where(xa => xa.Similarity == wwe); 
var allItemsCasted = itemsMax.Cast<NewType>(); // this throws 
var typeCompatibleItems = itemsMax.OfType<NewType>(); // this filters 
1

而不是通過matchings列舉的兩次(一次計算「最大相似性」,第二次發現具有最大相似性的項目)使用IEnumerable<T>.Aggregate,你可以在一個通做到這一點:

var sm = matchings.Aggregate((maxItem, next) => 
      next.Similarity > maxItem.Similarity ? next : maxItem);