2012-01-17 22 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(); 
      } 
} 

}

と私は2つのインスタンス間の交点を見つける必要がで定義されたクラスを持っていますGroupIdオブジェクト。

私は文を宣言した場合でも、利用可能な方法のLINQ交差で見ることができないのはなぜ

Using System.Linq 

... 

var x = _groupId1.Intersect(_groupId2); 

... 

エラー1「....グループID」 'の定義が含まれていません。交差していない「と何の拡張メソッド 『交差』タイプの最初の引数を受け入れる」...グループID」は見つけることができる(あなたがusingディレクティブまたはアセンブリ参照が不足している?)

+0

として宣言 'そのSystem.Linq'がSystem.Linqの使用'のためにミスで使用; '(小文字' using'とセミコロン最後に) – ChrisF

答えて

4

あなたGroupIdクラスは唯一の非を実装 - 一般IEnumerable c lass - LINQ拡張メソッドを使用する場合は、IEnumerable<T>を実装する必要があります。

非汎用のIListの代わりにIList<T>の汎用語を使用すると、これも簡単になることに注意してください。基本的に非汎用のコレクションは完全に新しいコードで回避してください可能であれば、

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

を...しかし、自分のクラスがIEnumerable<Intero>を実装するために非常に良く、次のようになります。

あなたはこのようなあなたのIEnumerableIEnumerable<T>に変換するCastを使用することができます。

2

_groupId1IListと表示されているため、IEnumerableとなっています。

ほぼすべてのlinq拡張メソッドで汎用の列挙型(IEnumerable<T>)が必要です。宣言を変更するか、Cast<T>またはOfType<T>のいずれかの拡張子を使用してください。

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

試すまたはIと仮定していIList<Intero>

関連する問題