1

オブジェクトのリストから最大オブジェクトを見つけるために linq を実行するだけで、それを var から object に戻します。それはどのように行われますか。

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);

これで、単一のアイテムが返され、必要に応じてキャストできます。

その値を持つ単一のアイテムのみが必要な場合は、上記が機能することに注意してください。

最大値を持つ複数のアイテムを持つことが可能であり、複数のアイテムを元に戻したい場合はWhereOfTypeまたはと組み合わせ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、オブジェクトのコレクションを返すことのようですが、必要なオブジェクトは 1 つだけです。試すitemsMax.Single()

于 2012-06-29T11:04:25.963 に答える
1

2回(「最大類似度」を計算するために1回、最大類似度を持つアイテムを見つけるために2回目)を列挙する代わりにmatchings、次を使用して1回のパスでこれを行うことができます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 に答える