3

プロジェクトを完了する必要がありますが、単純な問題があります

このように定義されたクラスがあります

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オブジェクトのインスタンス間の共通部分を見つける必要があります。

ステートメントを宣言したのに、使用可能なメソッドでLinqIntersectが表示されないのはなぜですか。

Using System.Linq 

...

var x = _groupId1.Intersect(_groupId2);

...

エラー1'....GroupId'に'Intersect'の定義が含まれておらず、タイプ'...GroupId'の最初の引数を受け入れる拡張メソッド'Intersect'が見つかりませんでした(usingディレクティブまたはアセンブリがありませんか?参照?)

4

2 に答える 2

4

GroupIdクラスは非ジェネリッククラスのみを実装します。LINQ拡張メソッドを使用する場合IEnumerableは実装する必要があります。IEnumerable<T>(とにかく、一般的にはより良い経験になるでしょう。)

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

あなたはあなたをこのように変換するために使うことができます:CastIEnumerableIEnumerable<T>

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

...しかし、クラスにを実装させるだけの方がはるかに良いでしょうIEnumerable<Intero>

于 2012-01-17T10:56:25.727 に答える
2

あなた_groupId1はとして宣言されているのでIList、それはただのIEnumerableです。

IEnumerable<T>ほぼすべてのlinq拡張メソッドには、一般的な列挙可能な()が必要です。宣言を変更するか、Cast<T>またはOfType<T>拡張機能のいずれかを使用するかを選択できます。

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

またはそれを宣言するIList<Intero>

于 2012-01-17T10:56:55.793 に答える