2017-12-03 254 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 '。 –