2011-07-08 65 views
2

我有一個小遊戲,在那裏我實現了一些碰撞檢測。現在我想獲得一個特定類型的所有項目列表,它們與當前的「實體」對象相沖突。我想要做這樣的事情:C#:鏈接Linq方法和鑄造

public List<T> GetCollidingObjects<T>() where T : Entity 
    { 
     return this.Game.World.Entities 
      .AsParallel() 
      .Where(e => e.IsColliding(this)) 
      .Where(e => e is T) 
      .ToList<T>(); 
    } 

我得到以下錯誤:

Instance argument: cannot convert from "System.Linq.ParallelQuery<GameName.GameObjects.Entity>" to "System.Collections.Generic.IEnumerable<T>" 

任何人都可以解釋,爲什麼出現這種情況?

謝謝!

+0

它可能不會解決你的問題,但是第二個Where子句可以用OfType ()來代替。 –

回答

8

您不能像這樣使用ToList()。您提供的通用參數(如果您選擇這樣做)必須匹配序列的類型。它是Entity的序列,而不是T

無論如何,你應該使用OfType()做過濾,這就是它的用途。

public List<T> GetCollidingObjects<T>() where T : Entity 
{ 
    return this.Game.World.Entities 
     .OfType<T>() 
     .AsParallel() 
     .Where(e => e.IsColliding(this)) 
     .ToList(); 
} 
+0

+1:另外,根據情況,將'.OfType ()'放在'.AsParallel()'之前可能會更好,因爲分區可能會做得更好,特別是如果存在實體內非隨機分佈的類型(很可能)。 –

+0

@ Reed:好點。我在討論'OfType()'應該在'AsParallel()'之前還是之後。 –

+0

嗨,謝謝你的解釋:-)它很棒!我明白爲什麼它不起作用。 – kpko

0

傑夫梅爾卡多的答案是正確的,但可以說得更清楚。

.Where(e => e is T) 

該調用到Enumerable.Where<Entity>返回IEnumerable<Entity>(源,這是一個IEnumerable<Entity>的濾波版本)。該呼叫不會返回IEnumerable<T>

Enumerable.Select<TSource, TResult>Enumerable.OfType<TResult>可以返回一個IEnumerable具有比源不同的類型:

.Where(e => e is T) 
.Select(e => e as T) 

.Select(e => e as T) 
.Where(e => e != null) 

.OfType<T>()