2017-12-03 293 views
-2

我試圖返回一個項目集合,從現有的ConcurrentHashSet,但只選擇由某個ID的項目,我已經編寫了LINQ的編碼,我唯一掙扎的是它返回IEnumerable和我有一個自定義ConcurrentHashSet類,我不確定如何轉換它?。與LINQ關於自定義集合的地方?

我試着用(ConcurrentHashSet)鑄造,但它沒有工作,我ConcurrentHashSet確實實現IEnumerable所以我猜有可能..

public ConcurrentHashSet<Item> GetItemsById(int id) 
{ 
    return Items.Where(x => x.HasLoaded && x.Id == id); 
} 
+0

你可以爲你的ConcurrentHashSet添加返回IEnumerable的代碼嗎? 「項目」的類型是什麼? –

+0

爲什麼你需要「轉換」它?爲什麼操作你需要這樣做IEnumerable <>'不提供? –

+0

標題明確指出,它是一個自定義類型,但繼承IEnumerable。我需要轉換它,因爲.Where上的返回類型是可枚舉的,它必須是ConcurrentHashSet。 – game

回答

1

.Where返回IEnumerable<T>,你不能改變的。顯式投射,因爲您嘗試不起作用,因爲通過每個ConcurrentHashSetIEnumerable(繼承),IEnumerable不一定是ConcurrentHashSet。編譯器不能說。

  • 要麼實例化一個新的ConcurrentHashSet(假設它有一個 構造函數接收IEnumerable,它應該有):

    return new ConcurrentHashSet<Item>(Items.Where(x => x.HasLoaded && x.Id == id)); 
    
  • 或更改方法返回IEnumerable<Item>
-1

代碼下面返回一個集合,因爲它是可以在foreach中枚舉的:

public class Test 
    { 
     ConcurrentHashSet hashSet = new ConcurrentHashSet(); 
     public Test() 
     { 
      foreach (ConcurrentHashSet set in hashSet.GetItemsById(123)) 
      { 
      } 
     } 


    } 

    public class ConcurrentHashSet : HashSet<ConcurrentHashSet> 
    { 
     public Boolean HasLoaded { get; set; } 
     public int Id { get; set; } 

     public List<ConcurrentHashSet> GetItemsById(int id) 
     { 
      return this.Where(x => x.HasLoaded && x.Id == id).ToList(); 
     } 
    } 
+1

請求是設法返回'ConcurrentHashSet '而不是'ConcurrentHashSet '的集合。 'ConcurrentHashSet '已經是一個集合 –

+0

看最新的代碼。幾個小時前做了更改。 – jdweng

+0

提交者想要返回一個'ConcurrentHashSet '。這段代碼返回'List '。 –