1

ブール値パラメーターを使用した次のコードは、非常にうまく機能します。

public List<T> SearchByStatus(bool status, List<T> list)
{
    return (List<T>)list.Where(_item => _item.Executed == status);
}

しかし、私がこのようなものを使いたいなら

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return (List<T>)list.Where(_item => _item.CodeType == codeType);
}

、IDE はFunc<T, int, bool>1 つのパラメーターを受け入れないというエラーをスローします。私は少し調べて、たとえばこれを見つけました。ここで 2 番目のパラメーターを追加すると、

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return (List<T>)list.Where((_item, _index) => _item.CodeType == codeType);
}

Func<T, bool>2つのパラメーターを受け入れないと言っています。

メッセージ自体は正しいですが、最初のケースではオーバーロードされたバージョンの Where を使用し、2 番目のケースではオーバーロードされていないバージョンを使用したいと想定している理由がわかりません...何か間違ったことをしていますか?

PS: 使用される ECodes タイプは次のように定義されます。

public enum ECodes : int
{
    ....
}

それが問題を引き起こす可能性がありますか?

4

1 に答える 1

5

これらは両方とも正常に機能するはずです。

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return list.Where((_item, _index) => _item.CodeType == codeType).ToList();
}

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return list.Where(_item => _item.CodeType == codeType).ToList();
}

そうでない場合はusing System.Linq;、上部にあり、通常のLINQを使用しているかどうかを確認してください(LINQBridgeのようなわかりにくいものではありません)。

以下を使用することもできます。

public List<T> SearchByCodeType(ECodes codeType, List<T> list)
{
    return list.FindAll(_item => _item.CodeType == codeType);
}

これはすべて、明確に定義された適切な一般的な制約があることを前提としていることに注意してくださいT-T.CodeTypeおそらく:

class Foo<T> where T : IHazCodeType
{
    List<T> SearchByCodeType(ECodes codeType, List<T> list) {...}
}
interface IHazCodeType
{
    ECodes CodeType {get;}    
}
于 2013-11-07T13:54:48.783 に答える