0

クラスの IEnumerable コレクションと、同じものを返す関数を含む 2 つ目の IEnumerable コレクションがあります。例えば:

IEnumerable<MyClass1> list1;
IEnumerable<MyClass2> list2;

MyClass2 には MyClass1 の内部コレクションが含まれており、次のような機能があります。

Public MyClass2
{
    private IEnumerable<MyClass1> internalCollection;

    public IEnumerable<MyClass1> ReturnDuplicates(IEnumerable<MyClass1> duplicates
    {                        
        return internalCollection.Where(l => duplicates.Select(d => d.ID).ToString() == l.ID.ToString());
    }
    ...
}

次に、2つを比較する関数があります。

// Function to return a flag indicating if the two lists contain 
// any of the same data
public bool CheckDuplicates(IEnumerable<MyClass1> col1, IEnumerable<MyClass2> col2)
{
    // The following check is wrong as it returns null
    IEnumerable<MyClass1> dupe =                
            col2.Where(w => w.ReturnDuplicates(col1).Count() != 0)
                        as IEnumerable<MyClass1>;

    return (dupe.Count() != 0);
}

上記の CheckDuplicates() のステートメントは null を返します。ただし、即時ウィンドウでは:

col2.First().ReturnDuplicates(col1).Count()

1 を返します

問題の原因はわかっていると思います - ステートメントが戻ってきました

IEnumerable<MyClass2>

この種のチェックは foreach ステートメントなしで可能ですか?

4

1 に答える 1

1

なぜあなたはとしてキャストしていIEnumerable<MyClass1>ますか?デュープの種類は のようIEnumerable<MyClass2>です。そのため、変数はnull.

次のコードを試すことができます:

return col2.Any(w => w.ReturnDuplicates(col1).Any())

.Any()が必要とする完全な列挙を回避します.Count()。一致が見つかるとすぐに列挙を停止します。

于 2012-05-03T09:02:31.507 に答える