5

私はこのようなクラスを持っています:

class Person
{
    private String sName;
    private String sPhone;
    private String sAge;
    private String sE_Mail;
    // … code …
}

そして、ユーザーから受け取った値で検索する必要があります。これは、このクラスの任意の属性である可能性があります。私もこれを持っています:

public IEnumerable<Person> SearchByPhone(string value)
{
    return from person in personCollection                   
           where person.**SPhone** == value
           select person;
}

このような 4 つのメソッドがありますが、唯一の違いは属性です。1つの方法でこれを行う方法、または不可能な方法を教えてください。ありがとう。

4

3 に答える 3

5

個別のメソッドを記述する必要はありません。1 つの方法で十分です。

public IEnumerable<Person> Search<T>(T value, Func<Person,T> mapFunc)
{
    return from person in personCollection                   
           where mapFunc(person).Equals(value)
           select person;
 }

次に、次のように呼び出します。

Search("SOME VALUE", input=>input.sPhone);  //sPhone must be public
Search("SOME VALUE", input=>input.sAge);     //sAge must be public
于 2013-03-29T18:56:58.207 に答える
3

これには動的linqライブラリを使用できます

public IQueryable<Person> Search(string column, string value)
{
    return personCollection.Where(string.Format("{0} = @1", column), value);
}

または、式を自分で作成することもできます。

public IQueryable<Person> Search(string column, string value)
{
    var param = Expression.Parameter(typeof(T), "x");
    var prop = Expression.Property(param, column);
    var val = Expression.Constant(value, prop.Type);
    var equals = Expression.Equal(prop, val);
    var lambda = Expression.Lambda(equals, param);
    return personCollection.Where(lambda);
}
于 2013-03-29T18:57:14.577 に答える
1

最も簡単な方法は、where ステートメントを or 演算にすることです。

public IEnumerable<Person> SearchByValue(string value)
{
    return from person in personCollection
           where (person.sName.Equals(value) || 
               person.sPhone.Equals(value) || person.sAge.Equals(value) || 
               person.sE_Mail.Equals(value));
}

個人的には、流暢なAPIを使用する方が冗長でなく、LINQコマンドの連鎖がもう少し明白になるため、使用することを好みます...ここにもその実装があります

public IEnumerable<Person> SearchByValue(string value)
{
    return personCollection.Where(p => p.sName.Equals(value) || 
               p.sPhone.Equals(value) || p.sAge.Equals(value) || 
               p.sE_Mail.Equals(value));
}
于 2013-03-29T19:02:24.917 に答える