2012-01-17 45 views
3

我必須完成的一個項目,但我有一個簡單的問題爲什麼我不能在實現IEnumerable的類上使用LINQ方法?

我有這樣

using System; 
using System.Collections; 
using System.Collections.Generic; 

.. 

public class GroupId: XmlDataTransferObject, IEnumerable 
{ 
    private IList _groupId; 
    private string _nameId; 

    public GroupId() : this("GroupId", "Id") 
    { 
    } 

    public GroupId(string rootName, string nomeId) : base(rootName) 
    { 
     _groupId = new ArrayList(); 
     _nomeId = nomeId; 
    } 

    public override bool IsNull 
    { 
     get { return _groupId.Count == 0; } 
    } 

    public int Count 
    { 
     get { return _groupId.Count; } 
    } 

    public int Add(Intero i) 
    { 
     return _groupId.Add(i); 
    } 

    public Intero this[int index] 
    { 
     get { return (Intero)_groupId[index]; } 
     set { _groupId[index] = value; } 
    } 
... 

      public IEnumerator GetEnumerator() 
      { 
        return _groupId.GetEnumerator(); 
      } 
} 

}

定義一個類,我需要找到兩個實例之間的交集GroupId對象。

爲什麼我不能在現有的方法中的LINQ相交,即使我已經宣佈的聲明,請參閱:

Using System.Linq 

... 

var x = _groupId1.Intersect(_groupId2); 

... 

錯誤1「...的GroupId」不包含'的定義相交「沒有擴展方法‘交集’接受一個類型的第一個參數」 ...的GroupId」可以找到(是否缺少using指令或程序集引用?)

+0

我假定'使用System.Linq'爲'使用System.Linq的一個錯字;'(小寫'using'和分號最後) – ChrisF 2012-01-17 10:57:36

回答

4

GroupId類只實現了非 - 通用IEnumerable c如果你想使用LINQ擴展方法,你應該實現IEnumerable<T>。 (這通常會是一個更好的體驗呢。)

注意,這也將是比較容易,如果你使用一個通用IList<T>代替非通用IList - 基本上儘量完全避免在新代碼的非泛型集合,如果可能的話。

可以使用Cast轉換您IEnumerableIEnumerable<T>這樣的:

var x = _groupId1.Cast<Intero>().Intersect(_groupId2.Cast<Intero>()); 

...但它會更漂亮,只是讓你的類實現IEnumerable<Intero>

2

因爲您的_groupId1被宣佈爲IList,這只是一個IEnumerable

幾乎所有的linq擴展方法都需要泛型枚舉(IEnumerable<T>)。您的選擇是更改聲明,或者使用Cast<T>OfType<T>擴展名之一。

嘗試_groupId1.OfType<Intero>().Intersect(...)

或聲明爲IList<Intero>

相關問題