1
public class EcImageWrapper
{

    //etc...

    public IQueryable<EcFieldWrapper> ListOfFields
    {
        get
        {
            //logic here

            return this.listOfFields.AsQueryable();
        }
    }

    public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, int, bool>> predicate)
    {
        return this.ListOfFields.Where(predicate).SingleOrDefault();
    }

    public EcFieldWrapper FindByName(string fieldName)
    {
        return this.FindBy(x => x.Name.ToUpper() == fieldName.ToUpper());
        //error here, wanting 3 arguments
        //which makes sense as the above Expression has 3
        //but i don't know how to get around this
    }

何らかの理由で、Expression> では 3 つの引数を使用する必要があります。過去には、問題のインスタンスに 2 つしか使用していませんでした。ただし、このインスタンス内のコレクションで検索を実行したいと考えています。

次のエラーが表示されます。

Delegate 'System.Func<MSDORCaptureUE.Wrappers.EcFieldWrapper,int,bool>' does not take 1 arguments
The best overloaded method match for 'CaptureUE.Wrappers.EcImageWrapper.FindBy(System.Linq.Expressions.Expression<System.Func<CaptureUE.Wrappers.EcFieldWrapper,int,bool>>)' has some invalid arguments
Argument 1: cannot convert from 'string' to 'System.Linq.Expressions.Expression<System.Func<CaptureUE.Wrappers.EcFieldWrapper,int,bool>>'

望ましい結果: クラス EcImageWrapper のインスタンス内で戻り型 EcFieldWrapper の述語と EcFieldWrapper の述語型を使用できるようにすること

なぜ3が必要なのですか?なぜint?

4

2 に答える 2

5

既存のメソッドは 3 つの引数を必要としませんExpression<Func<EcFieldWrapper, int, bool>>。これは、メソッドが受け入れると宣言したものであるため、 が必要です。それは次のようになります。

// This version ignores the index, but you could use it if you wanted to.
(value, index) => value.Name.ToUpper() == fieldName.ToUpper()

このオーバーロードindex呼び出しているため、 はコレクション内の位置になります。Queryable.Where

FindByインデックスが必要ないと仮定すると、メソッドを次のように変更したいだけだと強く思います。

public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, bool>> predicate)
{
    return this.ListOfFields.Where(predicate).SingleOrDefault();
}

または、より簡単にSingleOrDefault、述語を受け入れる whichのオーバーロードを使用します。

public EcFieldWrapper FindBy(Expression<Func<EcFieldWrapper, bool>> predicate)
{
    return this.ListOfFields.SingleOrDefault(predicate);
}

これで問題なく動作するはずです。そうでない場合は、試したときに何が起こるかをお知らせください。

于 2013-02-07T17:25:25.737 に答える
0

Findメソッドは必要ありません。ですべてを行いFindByNameます。

public EcFieldWrapper FindByName(string fieldName)
{
    fieldName = fieldName.ToUpper();
    return ListOfFields
       .SingleOrDefeault(x => x.Name.ToUpper() == fieldName);
}
于 2013-02-07T17:31:47.440 に答える